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 跟踪对折叠表达式的支持)。
我知道,截图不应该作为 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 跟踪对折叠表达式的支持)。