Eclipse 编辑器不显示函数错误,不包括枚举值
Eclipse editor not showing error on functions and enum values not included
我将 Eclipse CDT 用于 C 项目。我只使用编辑器,因为构建环境在 Eclipse 之外。
代码中的错误标记按预期显示,但有一些例外:
当我进行函数调用时,函数是否存在并不重要。编辑器永远不会在函数调用上显示错误标记。我希望出现 "Unresolved symbol" 错误或类似错误。
我希望拼写错误的函数名称显示为错误,并且我希望在我忘记包含的头文件中声明的现有函数显示为错误。但事实并非如此。
当我输入项目中其他地方(在头文件中)确实存在的枚举成员的名称时,编辑器会识别它,即使我不包含它所在的头文件已经包括了。这当然会导致编译器错误,但我希望编辑器中有一个错误标记。
是否缺少某些设置?或者这只是 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
的 特定实例 的拼写错误函数,方式编译器会,但它目前根本不对实例化主体进行类型检查。)
我将 Eclipse CDT 用于 C 项目。我只使用编辑器,因为构建环境在 Eclipse 之外。
代码中的错误标记按预期显示,但有一些例外:
当我进行函数调用时,函数是否存在并不重要。编辑器永远不会在函数调用上显示错误标记。我希望出现 "Unresolved symbol" 错误或类似错误。 我希望拼写错误的函数名称显示为错误,并且我希望在我忘记包含的头文件中声明的现有函数显示为错误。但事实并非如此。
当我输入项目中其他地方(在头文件中)确实存在的枚举成员的名称时,编辑器会识别它,即使我不包含它所在的头文件已经包括了。这当然会导致编译器错误,但我希望编辑器中有一个错误标记。
是否缺少某些设置?或者这只是 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
的 特定实例 的拼写错误函数,方式编译器会,但它目前根本不对实例化主体进行类型检查。)