Gnu C++编译器似乎定义__cplusplus为1
#include <iostream>
int main() {
std::cout << __cplusplus << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
这1在标准c ++模式下以gcc 打印,在C++ 0x模式下打印,使用gcc 4.3.4和gcc 4.7.0.
C++ 11 FDIS在"16.8预定义宏名[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
Run Code Online (Sandbox Code Playgroud)
是否有一种简单且合理的便携式方式来实现这样的开关?
我试图找到一种方法来获得Eclipse上的完整C++ 11支持.
在Eclipse朱诺我有很多的新功能__GXX_EXPERIMENTAL_CXX0X__,但我没有找到支持std::threads,std::mutex等等.
如何完成所有C++ 11功能?
编辑:解决方案
去吧Project -> Properties -> C/C++ General -> Path and Symbols -> Tab [Symbols].添加符号:__ cplusplus,其值为201103L
可能重复:
禁用Eclipse的错误发现.(Codan误报)
到目前为止,使用GCC 4.8/Clang 3.3 C++支持Eclipse正在进行语法检查(在功能支持方面),Eclipse将许多事情标记为实际上有效代码的错误(模板别名恰好是我的主要问题,但是还有其他问题).
当我编译(或尝试无论如何,遇到一些问题,请参阅此处了解更多)无论编译器正在做什么工作都能完成它的工作,并且它的错误会被传播,但是它所说的代码仍然可以强调(红色分别是错误和警告的金蜘蛛,这使得查看正在发生的事情变得更加困难.
有没有办法摆脱这些错误/警告?
更好的方法是只有在编译尝试之后才能摆脱警告,并且只要代码的相关部分没有改变,但仍然保持它们一般启用.
(实际上最好的是Eclipse的插件,它支持所有,或至少比Juno本身更多的C++ 11,但我似乎无法找到它)
可能重复:
关闭eclipse错误(这不是真正的错误)
我正面临这个恼人的问题:Eclipse拒绝识别该std::to_string函数,但我的程序编译没有错误.我错过了什么?
根据cppreference,std::to_string函数被定义<string>,因此我将其明确地包含在被控制的.cpp文件中.我也试过这个,这个和这个解决方案,没有运气.
还有其他建议吗?
编辑:
我在Linux下使用g ++ 4.7.2.
我在Eclipse CDT中遇到了代码分析器错误.它与C++ 11功能不兼容.__GXX_EXPERIMENTAL_CXX0X__已定义,并设置了编译器标志.库编译并正常工作,虽然我找不到告诉Eclipse这nullptr是一个关键字的方法!请不要突出显示它.

我正在使用当前LTS Ubuntu(12.04)的默认版本.这是Indigo(3.7.2).