34

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

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

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

C++11 FDIS 在“16.8 Predefined macro names [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

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

4

3 回答 3

32

这在大约一个月前已修复(对于 gcc 4.7.0)。错误报告读起来很有趣:http ://gcc.gnu.org/bugzilla/show_bug.cgi?id=1773

于 2011-09-23T13:59:46.917 回答
1

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

于 2011-09-23T13:59:07.683 回答
0

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

也就是说,编译器不符合要求。

显然它无法修复,因为修复它会破坏疯狂平台上的某些东西。

编辑:哦,我从@birryree 的评论中看到刚刚在 4.7.0 版中修复。所以,毕竟修复也不是不可能。呵呵。

干杯&hth。

于 2011-09-23T13:58:03.213 回答