为什么 Eclipse CDT 索引一个不在路径中的 header 文件?
Why does Eclipse CDT index a header file that's not in the path?
我正在使用 ARM DS-5 v5.20.0 包中的 Eclipse CDT v4.3.2 进行 Makefile
项目的代码开发和调试。
makefile 实际上是 mkefile 的层次结构,它根据命令行选项在多个配置中创建多个目标。
为了进行有效的静态分析,我使用项目的设置 Paths and Symbols
来帮助索引器找到各种包含文件并突出显示正确的条件编译代码段。
我们的项目包含一个 header 文件,该文件包含在代码树中的许多模块中。但是,header 文件的两个变体存在于两个相邻目录中,用于有条件地使用两个构建配置:
My_Project
|
+-- Include_1
| |
| +-- header.h
|
+-- Include_2
| |
| +-- header.h
|
+-- Source
| |
| +-- module_1.c
|
+-- makefile
这两个变体大部分相似,但也有一些差异。这些 header 包含一些宏定义和一个 enum
erated typedef
。具体来说,以下示例部件在两个变体中是相同的:
// header.h
#define SYMBOL 0x1
typedef enum {
constant = 0x2
} enum_t
典型的代码模块包括这些 header 之一,具体取决于 makefile 中的配置,并包含对 SYMBOL
和 constant
.
的引用
在 paths and Symbols
选项卡中,我只将 My_Project/Include_1
添加到路径列表中,因此索引器不应混淆。我还在 Window
->Preferences
->C/C++
->Indexer
菜单中禁用了 Allow heuristic resolution of includes
选项(事实上,我禁用了所有 Indexer 选项)。
尽管如此,当我在编辑器中打开 module.c
文件时,对 constant
的引用标有红色波浪下划线,并指示 Symbol 'constant' could not be resolved
错误.同时,对 SYMBOL
的引用没有错误指示。
当我将其中一个 header 文件重命名为 header_x.h
时,错误指示消失。
1.为什么我会收到这些索引器错误指示?
2。我怎样才能消除它们?
3。为什么只有枚举而不是#define-s?
我可以试着回答第二个问题
- How can I eliminate them?
我用eclipse-cdt
开发,我也遇到过这种观察。我总是执行以下操作之一,而且它经常对我有用。
- 默认
eclipse-cdt
会将未使用的 header 文件索引为 C++ / C 文件。这与您是否将它们添加到 paths & symbols
下无关。您可以通过 Project properties -> Indexer -> (un check) Index unused headers as C++ / C files
覆盖该行为。 [但是根据您的评论,您已经尝试禁用整个 Indexer
,我想这可能不适用于您的情况。不过,我会说值得一试]
- 有时,
Indexer
不会 运行 一旦您进行代码更改/header 更改。发生这种情况是由于内存限制和包含大量源文件的大项目,特别是包含大 LOC 的源文件。在这种情况下,您可以尝试 cleaning the project
并强制启动 re-indexing 以查看更改。
- 我经常尝试的最后一个选项是关闭/删除项目(不是项目内容)和单独 re-create 项目(以便新创建
.cproject
).这对我来说大部分时间都有效,但是不知道它背后的内部细节。所有这些主要是在试错的基础上尝试的,纯粹是 end-user 的观点。
Eclipse CDT 根据我的经验,索引器会索引项目目录中的源文件,无论您喜欢与否。只有一种方法可以避免您的情况:将他们排除在项目之外,据我所知,这可以通过两种方式完成:
- Select 资源,通过右键单击然后属性将其标记为派生并在资源中检查派生,然后重建索引
- 编写排除资源的独占过滤器。
您需要检查的另一件事是您没有在 PATH 或索引器可能考虑的其他环境变量中意外添加有问题的目录。
除了 CDT 出了什么问题之外,您似乎正在做一些不是最佳实践的事情。你应该把你的枚举放在一个单独的头文件中,并根据需要包含它。
然而,这是一种可能发生的情况,您可能无法采取不同的行动。
我正在使用 ARM DS-5 v5.20.0 包中的 Eclipse CDT v4.3.2 进行 Makefile
项目的代码开发和调试。
makefile 实际上是 mkefile 的层次结构,它根据命令行选项在多个配置中创建多个目标。
为了进行有效的静态分析,我使用项目的设置 Paths and Symbols
来帮助索引器找到各种包含文件并突出显示正确的条件编译代码段。
我们的项目包含一个 header 文件,该文件包含在代码树中的许多模块中。但是,header 文件的两个变体存在于两个相邻目录中,用于有条件地使用两个构建配置:
My_Project
|
+-- Include_1
| |
| +-- header.h
|
+-- Include_2
| |
| +-- header.h
|
+-- Source
| |
| +-- module_1.c
|
+-- makefile
这两个变体大部分相似,但也有一些差异。这些 header 包含一些宏定义和一个 enum
erated typedef
。具体来说,以下示例部件在两个变体中是相同的:
// header.h
#define SYMBOL 0x1
typedef enum {
constant = 0x2
} enum_t
典型的代码模块包括这些 header 之一,具体取决于 makefile 中的配置,并包含对 SYMBOL
和 constant
.
在 paths and Symbols
选项卡中,我只将 My_Project/Include_1
添加到路径列表中,因此索引器不应混淆。我还在 Window
->Preferences
->C/C++
->Indexer
菜单中禁用了 Allow heuristic resolution of includes
选项(事实上,我禁用了所有 Indexer 选项)。
尽管如此,当我在编辑器中打开 module.c
文件时,对 constant
的引用标有红色波浪下划线,并指示 Symbol 'constant' could not be resolved
错误.同时,对 SYMBOL
的引用没有错误指示。
当我将其中一个 header 文件重命名为 header_x.h
时,错误指示消失。
1.为什么我会收到这些索引器错误指示?
2。我怎样才能消除它们?
3。为什么只有枚举而不是#define-s?
我可以试着回答第二个问题
- How can I eliminate them?
我用eclipse-cdt
开发,我也遇到过这种观察。我总是执行以下操作之一,而且它经常对我有用。
- 默认
eclipse-cdt
会将未使用的 header 文件索引为 C++ / C 文件。这与您是否将它们添加到paths & symbols
下无关。您可以通过Project properties -> Indexer -> (un check) Index unused headers as C++ / C files
覆盖该行为。 [但是根据您的评论,您已经尝试禁用整个Indexer
,我想这可能不适用于您的情况。不过,我会说值得一试] - 有时,
Indexer
不会 运行 一旦您进行代码更改/header 更改。发生这种情况是由于内存限制和包含大量源文件的大项目,特别是包含大 LOC 的源文件。在这种情况下,您可以尝试cleaning the project
并强制启动 re-indexing 以查看更改。 - 我经常尝试的最后一个选项是关闭/删除项目(不是项目内容)和单独 re-create 项目(以便新创建
.cproject
).这对我来说大部分时间都有效,但是不知道它背后的内部细节。所有这些主要是在试错的基础上尝试的,纯粹是 end-user 的观点。
Eclipse CDT 根据我的经验,索引器会索引项目目录中的源文件,无论您喜欢与否。只有一种方法可以避免您的情况:将他们排除在项目之外,据我所知,这可以通过两种方式完成:
- Select 资源,通过右键单击然后属性将其标记为派生并在资源中检查派生,然后重建索引
- 编写排除资源的独占过滤器。
您需要检查的另一件事是您没有在 PATH 或索引器可能考虑的其他环境变量中意外添加有问题的目录。
除了 CDT 出了什么问题之外,您似乎正在做一些不是最佳实践的事情。你应该把你的枚举放在一个单独的头文件中,并根据需要包含它。
然而,这是一种可能发生的情况,您可能无法采取不同的行动。