Gnu C++宏__cplusplus标准符合?

tow*_*owi 32 c++ gcc standards-compliance c++-standard-library c++11

Gnu C++编译器似乎定义__cplusplus1

#include <iostream> 
int main() {
  std::cout << __cplusplus << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

1在标准c ++模式下以gcc 打印,在C++ 0x模式下打印,使用gcc 4.3.4和gcc 4.7.0.

C++ 11 FDIS在"16.8预定义宏名[cpp.predefined]"中

编译C++转换单元时,名称__cplusplus定义为值201103L.(脚注:本标准的未来版本将以更大的值替换此宏的值.不合格的编译器应使用最多五位小数的值.)

旧的std C++ 03也有类似的规则.

GCC是否将此设置为1,因为它"不符合"

通过阅读该列表,我认为__cplusplus如果我有一个支持C++ 11的编译器,我可以使用以便携方式检查.但是使用g ++这似乎不起作用.我知道...EXPERIMENTAL...宏,但很好奇为什么g ++__cplusplus这种方式定义.

我最初的问题是在不同的空指针变体之间切换.像这样的东西:

#if __cplusplus > 201100L
#  define MYNULL nullptr
#else
#  define MYNULL NULL
#endif
Run Code Online (Sandbox Code Playgroud)

是否有一种简单且合理的便携式方式来实现这样的开关?

Kus*_*nda 30

这是在一个月前修复的(对于gcc 4.7.0).错误报告提供了一个有趣的读物:http://gcc.gnu.org/bugzilla/show_bug.cgi?id = 1773

  • 错误报告链接+1.很有意思. (5认同)