Gnu C++宏__cplusplus是否符合标准?

34

看起来GNU C++编译器将__cplusplus定义为1

#include <iostream> 
int main() {
  std::cout << __cplusplus << std::endl;
}

在标准 C++ 模式下,使用 gcc 4.3.4 和 gcc 4.7.0,这将打印出 1。C++11 FDIS 在 "16.8 预定义的宏名称 [cpp.predefined]" 中规定:

在编译 C++ 翻译单元时,将宏 __cplusplus 定义为值 201103L(注:本标准的未来版本将用更大的值替换此宏的值。不符合规范的编译器应使用带有最多五个小数位的值。)。

C++03 标准也有类似的规定。

GCC 是否故意将其设置为 1,因为这是“不符合规范”?

通过阅读该列表,我认为可以使用 __cplusplus 来检查是否启用了 C++11 编译器。但是,在使用 g++ 时,似乎不能正常工作。我知道 ... EXPERIMENTAL ... 宏,但是我想知道为什么 g++ 以这种方式定义 __cplusplus

我的原始问题是在不同的空指针变体之间切换。类似这样:

#if __cplusplus > 201100L
#  define MYNULL nullptr
#else
#  define MYNULL NULL
#endif

有没有一种简单而相对可移植的方法来实现这样的开关?


13
注:我并没有完全阅读此讨论串,但是这在 g++ 中被确认为一个 bug(10 年前!),并且在 4.7.0 版本中已经修复了:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=1773 - wkl
如何看待以下代码:#ifndef nullptr #define nullptr NULL #endif 或者 #ifdef nullptr #define MYNULL nullptr #else #define MYNULL NULL #endif - Robin Hsu
3个回答

32

哇,上周我更新了我的svn代码库,但没有在那个编译器上运行测试代码。等等...是的,你说得对!来自上周的gcc-4.7.0:./define-cplusplus.x 199711 - towi
1
这个漏洞已经存在了10年以上...确实是一篇有趣的阅读。 - Richard

1
如果我没记错的话,这与Solaris 8有关,在设置__cplusplus时会出现问题。当时,gcc团队决定支持Solaris 8平台而不是在这个特定条款上合规。但我注意到最新版本的gcc停止了对Solaris 8的支持,我想这是朝着正确方向迈出的第一步。

0

这是一个非常古老的g++ bug。

也就是说,编译器不符合规范。

显然,它无法修复,因为修复它会在某个疯狂的平台上产生错误。

编辑:哦,我从@birryree的评论中看到,这在4.7.0版本中刚刚被修复了。所以,它并不是不可能被修复。嘿。

干杯&祝好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接