为什么 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 包含一些宏定义和一个 enumerated typedef。具体来说,以下示例部件在两个变体中是相同的:

// header.h
#define SYMBOL 0x1
typedef enum {
    constant = 0x2
} enum_t

典型的代码模块包括这些 header 之一,具体取决于 makefile 中的配置,并包含对 SYMBOLconstant.

的引用

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?

我可以试着回答第二个问题

  1. How can I eliminate them?

我用eclipse-cdt开发,我也遇到过这种观察。我总是执行以下操作之一,而且它经常对我有用。

  1. 默认 eclipse-cdt 会将未使用的 header 文件索引为 C++ / C 文件。这与您是否将它们添加到 paths & symbols 下无关。您可以通过 Project properties -> Indexer -> (un check) Index unused headers as C++ / C files 覆盖该行为。 [但是根据您的评论,您已经尝试禁用整个 Indexer,我想这可能不适用于您的情况。不过,我会说值得一试]
  2. 有时,Indexer 不会 运行 一旦您进行代码更改/header 更改。发生这种情况是由于内存限制和包含大量源文件的大项目,特别是包含大 LOC 的源文件。在这种情况下,您可以尝试 cleaning the project 并强制启动 re-indexing 以查看更改。
  3. 我经常尝试的最后一个选项是关闭/删除项目(不是项目内容)和单独 re-create 项目(以便新创建 .cproject ).这对我来说大部分时间都有效,但是不知道它背后的内部细节。所有这些主要是在试错的基础上尝试的,纯粹是 end-user 的观点。

Eclipse CDT 根据我的经验,索引器会索引项目目录中的源文件,无论您喜欢与否。只有一种方法可以避免您的情况:将他们排除在项目之外,据我所知,这可以通过两种方式完成:

  1. Select 资源,通过右键单击然后属性将其标记为派生并在资源中检查派生,然后重建索引
  2. 编写排除资源的独占过滤器。

您需要检查的另一件事是您没有在 PATH 或索引器可能考虑的其他环境变量中意外添加有问题的目录。

除了 CDT 出了什么问题之外,您似乎正在做一些不是最佳实践的事情。你应该把你的枚举放在一个单独的头文件中,并根据需要包含它。

然而,这是一种可能发生的情况,您可能无法采取不同的行动。