Gnu C ++宏__cplusplus标准符合?

时间:2011-09-23 13:52:50

标签: c++ gcc c++11 standards-compliance c++-standard-library

Gnu C ++编译器似乎将__cplusplus定义为1

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

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

C ++ 11 FDIS在“16.8预定义的宏名[cpp.predefined]”中说

  

在编译C ++翻译单元时,名称__cplusplus被定义为值201103L 。 (脚注:本标准的未来版本将取代具有更大价值的宏的价值。不符合要求   堆积者应使用最多五位小数的值。)

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

GCC是否将此设置为1,因为它是“不合规”

通过阅读该列表,我认为如果我启用了C ++ 11编译器,我可以使用__cplusplus以便携方式进行检查。但是使用 g ++ 这似乎不起作用。我知道...EXPERIMENTAL...宏,但很奇怪为什么 g ++ 以这种方式定义__cplusplus

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

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

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

3 个答案:

答案 0 :(得分:28)

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

答案 1 :(得分:0)

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

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

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

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

干杯&amp;第h

答案 2 :(得分:0)

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