更新:
这些错误似乎来自Eclipse的代码分析器CODAN,出现在Problems视图中,错误所指的行上也用红色下划线。奇怪的是,构建项目成功地创建了可执行文件,而构建不会在控制台中报告这些错误。我可以运行该可执行文件并获得预期的输出。
因此,现在的问题变成了:如何让Eclipse的CODAN识别出这些使用lambda和函数指针的std::function
不是错误?
原始问题:
在下面的C++代码中,它直接使用g++
进行良好编译,但在Eclipse CDT中会导致错误。如何让我的Eclipse项目识别并允许在std::function
中使用lambdas(或函数指针(?
注意:请参阅问题底部的编辑以更新
#include <functional>
#include <iostream>
void foo(int i) {
std::cout << i << std::endl;
}
void function_ptr(void (*bar)(int)) {
bar(1);
}
void function_std(std::function<void(int)> baz) {
baz(2);
}
int main() {
// these function calls are ok
function_ptr(&foo);
function_ptr([](int i) -> void {
foo(i);
});
// these function calls cause errors
function_std(&foo);
function_std([](int i) -> void {
foo(i);
});
// these assignments cause errors
std::function<void(int)> f1 = foo;
std::function<void(int)> f2 = [](int i) -> void {
foo(i);
};
f1(3);
f2(3);
return 0;
}
在命令行上编译此代码可以按预期工作,并产生以下输出:
$ g++ src/LambdaFunctionParameterExample.cpp -o example
$ ./example
1
1
2
2
3
3
然而,在Eclipse中,接受std::function
作为参数的函数调用会产生以下错误:
Invalid arguments '
Candidates are:
void function_std(std::function<void (int)>)
'
std::function
变量分配会产生以下错误:
Invalid arguments '
Candidates are:
function()
function(std::nullptr_t)
function(const std::function<void (int)> &)
function(std::function<void (int)> &&)
function(#10000)
'
我在Project中将语言标准设置为ISO C++17 (-std=c++17)
->属性->C/C++内部版本->GCC C++编译器->地方话(根据本文档,我认为设置此属性是访问<functional>
标头所必需的。奇怪的是,指定(或不指定(语言级别不会影响上述错误。而且,当直接使用g++
构建时,不需要指定语言级别。(
我使用的是macOS Catalina 10.15.5,来自自制程序的gcc 10.2.0,以及Eclipse CDT版本2020-09(4.17.0(。
此行为是Eclipse CDT 10.0版本中的一个已知错误。
更新:
此问题已通过升级到Eclipse CDT 10.1版本修复:
https://download.eclipse.org/tools/cdt/builds/10.1/cdt-10.1.0-rc2/
修复步骤:
- 在
Help
->中输入上述URL;Install New Software...
->Work with:
并安装所有选项 - 重新启动Eclipse
- 选择
Project
->C/C++ Index
->Rebuild