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

Eclipse indexer shows false-positive semantic errors

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

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

我指的是已经存在的线程 [1] and [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);
}

Invalid arguments ' Candidates are: #0 next(#0, std::iterator_traits<#0>::difference_type) Semantic Error

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

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

Invalid arguments ' Candidates are: std::basic_string,std::allocator> substr(?, ?) Semantic Error

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

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

Function 'Compare' could not be resolved
Semantic Error


我测试了各种项目设置,得出的结论是它与 Eclipse 项目的 "Paths and Symbols" 设置以及 "Preprocessor Include Paths, Macros, etc." 设置有关。特别是 Provider 的顺序对任何更改都非常敏感。

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

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

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


索引器启用了项目特定设置。到目前为止,我还没有找到任何可以消除错误的开关。


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

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

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

i 变为 *(v.begin()) 类型,在您的代码中是 intstd::next 需要迭代器并且该迭代器还必须提供 difference_type 类型。

基于范围的 for 循环的全部目的是不必担心在容器中前进。如果你想打印向量中的所有内容,你只需使用

for (auto i : v)
{
    std::cout << i << " ";
}

我知道这不能解决您的其他错误,但可以解决第一个错误

我将 Eclipse CDT 更新到 8.8.1 版,误报编译错误不再出现。所以毕竟是软件bug。