【发布时间】:2011-11-23 17:00:48
【问题描述】:
Gnu C++ 编译器似乎将__cplusplus 定义为1
#include <iostream>
int main() {
std::cout << __cplusplus << std::endl;
}
这会在标准 c++ 模式下使用 gcc 打印 1,以及在 C++0x 模式下使用 gcc 4.3.4 和 gcc 4.7.0。
C++11 FDIS 在“16.8 预定义宏名称 [cpp.predefined]”中说
在编译 C++ 翻译单元时,名称
__cplusplus被定义为 值 201103L。 (脚注:这个标准的未来版本打算用一个更大的值替换这个宏的值。不合格的 com- 堆垛机应使用最多五个十进制数字的值。)
旧的标准 C++03 也有类似的规则。
GCC 是否故意将其设置为 1,因为它“不合格”?
通过阅读该列表,我认为如果我有启用 C++11 的编译器,我可以使用 __cplusplus 以可移植的方式检查。但是对于 g++,这似乎不起作用。我知道 ...EXPERIMENTAL... 宏,但很好奇为什么 g++ 以这种方式定义 __cplusplus。
我最初的问题是在不同的空指针变体之间切换。像这样的:
#if __cplusplus > 201100L
# define MYNULL nullptr
#else
# define MYNULL NULL
#endif
是否有一种简单且可移植的方式来实现这样的开关?
【问题讨论】:
-
旁注:我还没有完全阅读这个线程,但这被认为是 g++ 中的一个错误(10 年前!)并在 4.7.0 中修复:gcc.gnu.org/bugzilla/show_bug.cgi?id=1773
-
怎么样
#ifndef nullptr#define nullptr NULL#endif或#ifdef nullptr#define MYNULL nullptr#else#define MYNULL NULL#endif
标签: c++ gcc c++11 standards-compliance c++-standard-library