Eclipse索引器显示误报语义错误

时间:2016-03-02 16:56:42

标签: c++ eclipse c++11 gcc eclipse-cdt

我最近更新到Eclipse Mars.2(版本4.5.2)并将我的项目切换到C ++ 11开发(是的,这是时间!)。

我设法将所有Makefile配置为正确构建(即没有明显的错误或警告),但Eclipse内置索引器报告了几个误报的语义错误。并非所有这些都与C ++ 11特定功能有关。

我指的是已经存在的线程[1][2],这些线程较旧,并没有为我带来任何真正的解决方案。

假阳性示例

std::next(..)无法识别 - 但我对std::begin()std::end()没有任何问题:

std::vector<int> v;
for (auto i = std::begin(v); i != std::end(v); i++)
{
  std::next(i);
}
  

无效的参数'   候选人是:   #0 next(#0,std :: iterator_traits&lt;#0&gt; :: difference_type)   语义错误

std::string::substr(..)无法识别:

std::string myString = "test";
myString.substr(0, 1);
  

无效的参数'   候选人是:   的std :: basic_string的,性病::分配器&GT; substr(?,?)   语义错误

googletest的ASSERT_EQ宏未被识别(但是,其他断言有效!):

std::string expValue = "test";
std::string actValue = "test";
ASSERT_EQ(expValue, actValue);
  

无法解决功能'比较'   语义错误

我已经测试了各种项目设置,我得出的结论是它与Eclipse项目的“路径和符号”设置以及“预处理器包含路径,宏等”有关。设置。特别是提供商的订单对任何更改都非常敏感。

另外一个问题是我有一个较旧的系统,其中包含gcc 4.4.4编译器(/usr/bin/gcc中的默认值)和/opt/...中安装的附加gcc 4.8.2,它实际上应用于编译。这也意味着我有两组头文件,但只有一套包含C ++ 11功能。

我当前的配置是这样的(如项目设置中所示 - &gt; C / C ++常规 - &gt;预处理器包含路径 - &gt;条目):

  • CDT用户设置条目
    • gcc 4.8.2的系统标题(视为内置)
    • 预处理器宏__cplusplus = 201103L
  • CDT托管构建设置条目
    • 自定义包含和库路径的路径
  • CDT GCC构建输出分析器
  • CDT GCC内置编译器设置
    • gcc 4.4.4
    • 的不可变系统标题
    • local includes

我也尝试了其他组合,但是这个组合给我的误报率最低。

索引器已启用项目特定设置。到目前为止,我还没有发现任何切换,导致错误消失。

有没有人遇到过这样的问题?它是我的路径和符号的配置问题还是Eclipse索引器中的错误?

2 个答案:

答案 0 :(得分:1)

std::next(i);不正确。当你使用

for (auto i : v)
{
    std::next(i);
}

i变为*(v.begin())类型,代码中的intstd::nextdifference_type需要一个迭代器,迭代器也必须提供for (auto i : v) { std::cout << i << " "; } 类型。

基于范围的for循环的整个目的是不必担心通过容器前进。如果你想从矢量中打印出所有东西,你只需要使用

type

我知道这并没有解决你的其他错误,但它修复了第一个错误

答案 1 :(得分:1)

我将Eclipse CDT更新到版本8.8.1,并且不再显示误报编译错误。毕竟这是一个软件错误。