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

2022-05-07 10:00:55 浏览数 (1)

最近在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了

0 人点赞