Eclipse 编辑器不显示函数错误,不包括枚举值

Eclipse editor not showing error on functions and enum values not included

我将 Eclipse CDT 用于 C 项目。我只使用编辑器,因为构建环境在 Eclipse 之外。

代码中的错误标记按预期显示,但有一些例外:

  1. 当我进行函数调用时,函数是否存在并不重要。编辑器永远不会在函数调用上显示错误标记。我希望出现 "Unresolved symbol" 错误或类似错误。 我希望拼写错误的函数名称显示为错误,并且我希望在我忘记包含的头文件中声明的现有函数显示为错误。但事实并非如此。

  2. 当我输入项目中其他地方(在头文件中)确实存在的枚举成员的名称时,编辑器会识别它,即使我不包含它所在的头文件已经包括了。这当然会导致编译器错误,但我希望编辑器中有一个错误标记。

是否缺少某些设置?或者这只是 eclipse 编辑器的工作方式?

我依稀记得很久以前看到过那些错误标记,但记忆可能会欺骗我...

解析其定义在项目中但无法通过包含访问的名称是一个已知问题。它由 bug 297690, and it's close to being fixed (with most of the hard work being done in bug 402498).

跟踪

解析一个根本不在项目中的函数的名称,可能发生在两种情况下。

在 C 代码中

C 语言不要求函数在使用前声明。没有前面声明的使用被视为隐式声明。

即以下C文件为有效代码:

void func() {
  another_func();  // another_func is implicitly declared here
}

linker 将尝试在 link 时找到匹配的函数定义,如果找不到则给出错误。

所以,如果你拼错了another_func,这个错误不会在编译时被捕获(只在linking时),同样CDT也无法诊断它。

在 C++ 模板代码中

与 C 不同,C++ 要求函数在使用前声明。但是,模板有一个微妙之处。

如果函数调用发生在模板内部并且某些参数是相关的:

template <typename T>
void foo(T t) {
  misspelt_function(t);
}
由于 C++ 的两阶段名称查找规则的工作方式,

CDT 无法诊断 foo 定义处的拼写错误函数:提供定义是有效的在 misspelt_function 之后foo 的定义点(但在实例化点之前),这是通过参数相关查找(通过在关联的名称空间中)找到的对于此特定实例,类型为 t)。

(CDT 理论上可以 诊断 foo 特定实例 的拼写错误函数,方式编译器会,但它目前根本不对实例化主体进行类型检查。)