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 特性它还不支持),所以如果 &lt;variant&gt; 标头正在使用此类较新的特性,Eclipse 可能无法正确解析它。 @HighCommander4 是否至少有一个解决方法,比如我将这个__cplusplus 设置为201703L?现在,半源因此被标记为红色!有什么信息应该支持吗? @HighCommander4 我正在使用@suppress 指令。我想我可以忍受它。 【参考方案1】:

第一个障碍是让 Eclipse 识别代码是在 C++17 模式下编译的。

有几种方法可以做到这一点,但我发现最可靠的一种方法是转到Project Properties -&gt; C/C++ General -&gt; Preprocessor Include Paths, Macros etc. -&gt; Providers tab -&gt; CDT GCC Built-in Compiler Settings 并将-std=c++17 添加到“获取编译器规范的命令”中。然后Project -&gt; C/C++ Index -&gt; 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> 包含文件的主要内容,如果未能解决你的问题,请参考以下文章

Eclipse CDT“无法解析符号 NULL”

Eclipse CDT 编辑器无法识别 OpenGL 扩展

C 文件与 C++ 文件的 Eclipse CDT 索引器结果不同

利用Eclipse CDT 阅读C/C++代码

带有 MinGW GCC 的 Eclipse CDT 生成错误 127

在 Eclipse CDT 中使用 operator[] 解决向量向量中的“大小”问题