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++ 常规 -> 预处理器包含路径 -> 条目中所示):
- CDT 用户设置条目
- gcc 4.8.2 的系统头文件(视为内置)
- 预处理器宏
__cplusplus = 201103L
- CDT 托管构建设置条目
- 自定义包含路径和库路径
- CDT GCC 构建输出解析器
- CDT GCC 内置编译器设置
- gcc 4.4.4 的不可更改的系统头文件
- 本地包括
我也尝试过其他组合,但这个组合的误报率最低。
索引器启用了项目特定设置。到目前为止,我还没有找到任何可以消除错误的开关。
有没有人也遇到过这样的问题?这是我的路径和符号的配置问题还是 Eclipse 索引器中的错误?
std::next(i);
不正确。当你使用
for (auto i : v)
{
std::next(i);
}
i
变为 *(v.begin())
类型,在您的代码中是 int
。 std::next
需要迭代器并且该迭代器还必须提供 difference_type
类型。
基于范围的 for 循环的全部目的是不必担心在容器中前进。如果你想打印向量中的所有内容,你只需使用
for (auto i : v)
{
std::cout << i << " ";
}
我知道这不能解决您的其他错误,但可以解决第一个错误
我将 Eclipse CDT 更新到 8.8.1 版,误报编译错误不再出现。所以毕竟是软件bug。
我最近更新到 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++ 常规 -> 预处理器包含路径 -> 条目中所示):
- CDT 用户设置条目
- gcc 4.8.2 的系统头文件(视为内置)
- 预处理器宏
__cplusplus = 201103L
- CDT 托管构建设置条目
- 自定义包含路径和库路径
- CDT GCC 构建输出解析器
- CDT GCC 内置编译器设置
- gcc 4.4.4 的不可更改的系统头文件
- 本地包括
我也尝试过其他组合,但这个组合的误报率最低。
索引器启用了项目特定设置。到目前为止,我还没有找到任何可以消除错误的开关。
有没有人也遇到过这样的问题?这是我的路径和符号的配置问题还是 Eclipse 索引器中的错误?
std::next(i);
不正确。当你使用
for (auto i : v)
{
std::next(i);
}
i
变为 *(v.begin())
类型,在您的代码中是 int
。 std::next
需要迭代器并且该迭代器还必须提供 difference_type
类型。
基于范围的 for 循环的全部目的是不必担心在容器中前进。如果你想打印向量中的所有内容,你只需使用
for (auto i : v)
{
std::cout << i << " ";
}
我知道这不能解决您的其他错误,但可以解决第一个错误
我将 Eclipse CDT 更新到 8.8.1 版,误报编译错误不再出现。所以毕竟是软件bug。