解决std::addressof找不到及eclipse lunna+cdt 8.6.0 支持 c++11的设置

来源:互联网 发布:淘宝买水果坏了怎么办 编辑:程序博客网 时间:2024/05/19 22:59

最近在eclipse下写c++代码,当用到std::addressof时,eclipse报错,说是无法解析这个函数:

错误信息:Function 'addressof' could not be resolved
但带两个下划线前缀的同名函数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支持的选项,如下:

#判断编译器类型,如果是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了
这里写图片描述

1 0
原创粉丝点击