Eclipse CDT 没有正确解析 <variant> 包含文件

Eclipse CDT does not parse <variant> include file correctly

我知道,截图不应该作为 MCVE 提供,但在这里我想指出错误。

将焦点移动到包含文件中,然后我看到了问题:

我以折叠所有非活动预处理器指令的方式设置了 Eclipse。因此,很明显 Eclipse 没有为预处理器定义正确的值 #define __cplusplus [- 对于 Eclipse - 非活动代码也有灰色背景,第 34 行]。

我正在使用 gcc 7.3-std=c++17

我遗漏了什么以及如何将此 __cplusplus 设置为正确的值? 这个小MCVE当然可以编译了。

技术资料:

Eclipse IDE for C/C++ Developers

Version: Oxygen.3a Release (4.7.3a)

Build id: 20180405-1200

Eclipse 本身显然不支持 C++17,所以我不得不在 Project -> Properties -> [=38 中设置=]C/C++ 构建 -> 设置 -> GCC C++ 编译器 -> 方言 -> 其他方言标志 -std=c++17

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

有几种方法可以做到这一点,但我发现最可靠的方法是转到 Project Properties -> C/C++ General -> Preprocessor Include Paths, Macros etc. -> Providers tab -> CDT GCC Built-in Compiler Settings 并将 -std=c++17 添加到 "Command to get compiler specs"。然后做 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 特性。特别是,它无法解析 折叠表达式 ,它们在 libstdc++(GCC 附带的标准库)实现 variant 的定义中被大量使用。结果,Eclipse 无法解析 variant class 定义,因此不知道 variant 有哪些成员。

正如您发现的那样,一种解决方法是使用 @suppress 来抑制由此产生的误报错误。请注意,您还会在编辑器功能方面受到一些损害,例如无法对类型为 variant.

的对象进行代码补全

您可以考虑 contributing to Eclipse's C++ parser (this bug 跟踪对折叠表达式的支持)。