最近在eclipse下写c 代码,当用到std::addressof时,eclipse报错,说是无法解析这个函数:
但带两个下划线前缀的同名函数std::__addressof
却是可以用的,而且使用std::addressof时也能正常命令行编译,不会报错
本来打算就这么将就用吧,不想去进一步搞清楚原因了,除了那红字看着不爽,没别的影响。
但是代码在vs2010下编译时又出错了,说是找不到 std::__addressof这个方法,但是可以是可以找到addressof,
这可有点麻烦了,仔细研究了一下,原来addressof是纳入c 11标准中的函数,c 11以前的标准对addressof的实现名称没有统一规定,所以各个编译器的名字不尽相同,
对于gcc(5.2.0),头文件include/c /bits/move.h
中虽然同时定义了std::addressof和std::__addressof,
但在move.h中通过对__cplusplus宏变量的判断来决定是否定义std::addressof函数,如果__cplusplus小于201103L(c 11标准的版本号),就不会定义std::addressof函数,
默认安装的cdt8.6.0,__cplusplus的定义是199711L,所以就没有定义std::addressof函数。 如下图:eclipse内置编译器的预定义宏变量
我用的mingw版本是支持c 11标准的,而且CMakeList.txt中也特意加入了c 11支持的选项,如下:
代码语言:javascript复制#判断编译器类型,如果是gcc编译器,则在编译选项中加入c 11支持
if(CMAKE_COMPILER_IS_GNUCXX)
add_definitions("-std=c 11")
message(STATUS "optional:-std=c 11")
endif(CMAKE_COMPILER_IS_GNUCXX)
所以使用std::addressof
方法时命令行编译是可以正常通过的,但是eclipse IDE内置的编译器(CDT Built-in compiler)默认的设置中仍然没有支持c 11的选项,所以eclipse IDE环境下使用std::addressof
会报错。
所以现在的问题就变成了如何让eclipse内置编译器也支持c 11,
在网上看了一些资料,主要的办法就是修改eclipse的内置编译器的设置,
步骤1:
打开菜单:
Window -> Preferences -> C/C -> Build -> Settings -> Discovery -> CDT GCC Build-in Compiler Settings
添加-std=c 11
步骤2:
Properties -> C/C General -> Preprocessor Include Paths, Marcos etc. -> Providers
勾选 CDT GCC Build-in Compiler Settings
并将之设置为最优先(移到最顶端)
上面两步,也可以改为将
CDT GCC Build-in Compiler Settings MinGW
添加c 11支持,并在第二步中使用CDT GCC Build-in Compiler Settings MinGW
,效果是一样的
步骤3: 菜单里面选择 Project ->C/C Index 重建索引(Rebuild), 然后错误消失,Build-in Compiler就正确支持c 11了。 这时你再打开move.h头文件,会发现__cplusplus的值已经是201103L了