Eclipse CDT无法正确解析<variant>包含文件

时间:2018-04-16 12:39:34

标签: c++ eclipse eclipse-cdt variant

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

enter image description here

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

enter image description here

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

我将gcc 7.3-std=c++17一起使用。

我缺少什么,如何将此__cplusplus设置为正确值? 这个小MCVE当然可以编译。

技术数据:

  

用于C / C ++开发人员的Eclipse IDE

     

版本:Oxygen.3a版本(4.7.3a)

     

构建ID:20180405-1200

Eclipse本身并不支持C ++ 17所以我必须在 Project 中设置 - &gt; 属性 - &gt; C / C ++ Build - &gt; 设置 - &gt; GCC C ++编译器 - &gt; Dialect - &gt; 其他方言旗帜 -std=c++17

1 个答案:

答案 0 :(得分: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添加到&#34;命令以获取编译器规格&#34 ;.然后执行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一起提供的标准库)的实现中被大量使用{{ 1}}。因此,Eclipse无法解析variant类定义,因此不知道成员variant具有哪些内容。

正如您所发现的,解决方法是使用variant来抑制因此而导致的误报错误。请注意,在编辑器功能方面您也会受到一些损害,例如在类型为@suppress的对象上没有获得代码完成。

您可以考虑contributing到Eclipse的C ++解析器(this bug跟踪对折叠表达式的支持)。