看起来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
有没有一种简单而相对可移植的方法来实现这样的开关?
#ifndef nullptr
#define nullptr NULL
#endif
或者#ifdef nullptr
#define MYNULL nullptr
#else
#define MYNULL NULL
#endif
- Robin Hsu