Eclipse CDT索引器无法完全识别c++11。

5
首先,我知道使用 -std=c++11 标志启用c++11支持的方法以及放置位置。我已将 -std=c++11 添加到 Project -> Properties -> C/C++ Build -> Settings -> Tool Settings -> GCC C++ Compiler -> Miscellaneous -> Other Flags 中,并编译工作正常。但是索引器不兼容,例如如果我想使用 std::map 的 emplace 函数 (c++11),它会找不到该函数。
#include <map>

int main() {
    std::map<int, int> data;
    data.emplace(5,5);

我还查看了这些相关问题:

更新:现在我已经尝试过,它甚至无法识别std :: map类型,尽管编译正常且eclipse找到所有头文件...

  • 编译器 Mingw64 GCC 5.2.0
  • Eclipse Mars 4.5
  • CDT 8.7

尝试这个答案:https://dev59.com/X2Qn5IYBdhLWcg3wETk5#24628885 - Galik
有一个索引器错误,但现在已经修复了。你尝试更新插件了吗?从菜单中选择“帮助->检查更新”。 - Galik
1
我原本以为索引器错误的修复已经发布了。我通过更新到当前的开发版本(实验性)来解决这个问题。该更新站点在这里:夜间版 - http://download.eclipse.org/tools/cdt/builds/master/nightly/,使用时请自行承担风险 :) - Galik
这是一个非常令人沮丧的错误,我以为他们会很快解决它。但显然不是这样。如果我没记错,这个错误只在升级到GCC 5.2时出现,可能是GCC库头文件的某些更改导致的。 - Galik
我认为因为GCC 5(.1或.2并不重要,2只是修复错误)是第一个引入完整功能C++11的gcc。 - Matze
显示剩余2条评论
2个回答

8

Eclipse Mars与先前版本有些不同。

第一步是使索引器错误高亮显示-在上面链接的启用Eclipse CDT(Juno / Kepler / Luna)中的C++11中进行了介绍。如果您已经完成了所有这些工作,那么我就不知道您遇到了什么问题。迄今为止,Mars一直有些奇怪。

  1. 转到项目->属性->C/C++常规->预处理器包含路径。
  2. 单击提供程序选项卡。
  3. 单击CDT GCC内置编译器设置MinGW
  4. 单击右侧的向上移动按钮。
  5. 在语言设置提供程序选项下
    1. 关闭使用在项目之间共享的全局提供程序
    2. 在Command to get compiler specs的命令行末尾添加-std=c++1y。

顺便说一句,如果有人知道全局设置在哪里,以便我可以将其默认为此行为,请告诉我。

第二步是使编译器工作

  1. 进入项目->属性->C/C++构建->设置。
  2. 进入工具设置选项卡。
  3. 展开GCC C++编译器
  4. 单击方言 从语言标准下拉菜单中选择您希望定位的C++标准。

2
除此之外,你的步骤1在我的情况下没有帮助,你可以在“Window->Preferences->C/C++->Build->Settings->Discovery”下完成它...这个问题真的很棘手,我可能会尝试另一个CDT版本... - Matze
抱歉我无法提供帮助,很高兴你能帮助我。谢谢! - user4581301

0

Eclipse CDT 通过运行索引器来理解窗口中的 C++ 代码。这个索引器实际上是使用特定编译选项调用 GCC C++ 编译器。有时候,您可能想要更改此索引器使用的编译器选项。

例如,我最近发现 C++11 容器和类(如 future)未被索引器解析,并且被下划线标记为红色波浪线。这是因为索引器使用的编译器选项没有 -std=c++11。

要更改索引器的编译器选项:

  1. 打开首选项并转到 C/C++ -> Build -> Settings。
  2. 单击“Discovery”选项卡,选择“CDT GCC 内置编译器设置”。
  3. 按您的意愿修改下面显示的命令字符串。例如,在此处添加了 -std=c++11。
  4. 保存后,Eclipse CDT 将自动重新索引您的 C++ 文件。但是,我发现这并没有删除未解决的项目。
  5. 我通过右键单击项目并选择“Index -> Rebuild”手动重新索引。这很有效!

“这个索引器不过是使用特定的编译选项调用GCC C++编译器。”这句话非常误导人。CDT的内置编译器设置提供程序确实会使用特定的编译选项调用GCC,但这是以空文件作为输入,并且唯一的目的是发现内置的包含路径和#定义。项目中的实际代码由CDT自己的解析器和代码分析器处理。 - HighCommander4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接