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
是否有一种简单且合理的便携方式来实现这样的转换?
答案 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的支持,我想这是朝着正确方向迈出的第一步。