Eclipse CDT 无法正确解析 <variant> 包含文件
Posted
技术标签:
【中文标题】Eclipse CDT 无法正确解析 <variant> 包含文件【英文标题】:Eclipse CDT does not parse <variant> include file correctly 【发布时间】:2018-04-16 12:39:33 【问题描述】:我知道,屏幕截图不应该作为 MCVE 提供,但在这里我想指出错误。
将焦点移到包含文件中我看到了问题:
我以折叠所有非活动预处理器指令的方式设置了 Eclipse。因此,很明显 Eclipse 没有为预处理器#define __cplusplus
定义正确的值[-对于 Eclipse-非活动代码也有灰色背景,第 34 行]。
我正在使用 gcc 7.3
和 -std=c++17
。
我缺少什么,如何将 __cplusplus
设置为正确的值?
这个小的 MCVE 当然可以编译。
技术数据:
面向 C/C++ 开发人员的 Eclipse IDE
版本:Oxygen.3a 版本 (4.7.3a)
版本号:20180405-1200
Eclipse 本身显然不支持 C++17,所以我必须在 Project -> Properties -> C/C++ Build 中进行设置-> 设置 -> GCC C++ 编译器 -> 方言 -> 其他方言标志 -std=c++17
【问题讨论】:
Eclipse 的解析器尚不支持 C++17 特性(并且有一些 C++14 特性它还不支持),所以如果<variant>
标头正在使用此类较新的特性,Eclipse 可能无法正确解析它。
@HighCommander4 是否至少有一个解决方法,比如我将这个__cplusplus
设置为201703L
?现在,半源因此被标记为红色!有什么信息应该支持吗?
@HighCommander4 我正在使用@suppress
指令。我想我可以忍受它。
【参考方案1】:
第一个障碍是让 Eclipse 识别代码是在 C++17 模式下编译的。
有几种方法可以做到这一点,但我发现最可靠的一种方法是转到Project Properties -> C/C++ General -> Preprocessor Include Paths, Macros etc. -> Providers tab -> CDT GCC Built-in Compiler Settings
并将-std=c++17
添加到“获取编译器规范的命令”中。然后Project -> C/C++ Index -> Rebuild
。
这应该可以让您的简单示例无错误地解决:
#include <variant>
std::variant<int, double> foo;
但是,一旦您尝试在变体上调用函数:
#include <variant>
std::variant<int, double> foo;
std::size_t i = foo.index();
在这种情况下,函数调用index()
被标记为错误。
这是因为 Eclipse 的解析器还不理解大多数 C++17 特性。特别是,它无法解析 折叠表达式,它们在 variant
的 libstdc++(GCC 附带的标准库)实现的定义中被大量使用。结果,Eclipse 无法解析variant
类定义,因此不知道variant
有哪些成员。
正如您所发现的,一种解决方法是使用@suppress
来抑制您因此得到的误报错误。请注意,您还会在编辑器功能方面受到一些损害,例如无法在类型为 variant
的对象上完成代码。
您可以考虑将 contributing 用于 Eclipse 的 C++ 解析器(this bug 跟踪对折叠表达式的支持)。
【讨论】:
以上是关于Eclipse CDT 无法正确解析 <variant> 包含文件的主要内容,如果未能解决你的问题,请参考以下文章
C 文件与 C++ 文件的 Eclipse CDT 索引器结果不同