为什么Eclipse CDT索引一个不在路径中的头文件?

ysa*_*sap 6 c indexer eclipse-cdt include

我正在使用ARM DS-5 v5.20.0包中的Eclipse CDT v4.3.2进行代码开发和Makefile项目调试.

makefile实际上是mkefiles的层次结构,它根据命令行选项在多个配置中创建多个目标.

为了允许有效的静态分析,我使用项目的设置Paths and Symbols来帮助索引器找到各种包含文件并突出显示正确的有条件编译的代码段.

我们的项目包含一个头文件,该文件包含在代码树中的许多模块中.但是,头文件的两个变体存在于两个相邻目录中,用于具有两个构建配置的条件使用:

My_Project
  |
  +-- Include_1
  |    |
  |    +-- header.h
  |
  +-- Include_2
  |    |
  |    +-- header.h
  |
  +-- Source
  |    |
  |    +-- module_1.c
  |
  +-- makefile
Run Code Online (Sandbox Code Playgroud)

这两种变体大多相似,但包含一些差异.这些头文件包含一些宏定义和一个enumerated typedef.具体而言,以下两个变体的样本部分相同:

// header.h
#define SYMBOL 0x1
typedef enum {
    constant = 0x2
} enum_t
Run Code Online (Sandbox Code Playgroud)

典型的代码模块包括这些头中的一个,具体取决于makefile中的配置,并包含对SYMBOL和的引用constant.

paths and Symbols选项卡中,我只添加My_Project/Include_1到路径列表中,因此索引器不应该混淆.我还在- > - > - > 菜单中禁用了该Allow heuristic resolution of includes选项(事实上​​,我禁用了所有Indexer选项).WindowPreferencesC/C++Indexer

所有这些,当我module.c在编辑器中打开文件时,引用constant标记为波浪形的红色下划线,并Symbol 'constant' could not be resolved指示错误.同时,引用SYMBOL没有错误指示.

当我重命名其中一个头文件时header_x.h,错误指示消失.

1.为什么我会得到这些Indexer错误指示?

2.我该如何消除它们?

3.为什么只有枚举而不是#define -s?

g24*_*24l 5

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

  1. 选择资源,右键单击它标记为派生,然后在属性中并在资源中检查派生,然后重建索引
  2. 编写一个排除资源的排除过滤器。

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

除了CDT出了什么问题以外,看来您正在做的事情不是最佳实践。您应该将枚举放在带有标头保护符的单独的标头文件中,并根据需要包含它。

但是,这种情况可能会发生,您可能没有奢侈地采取不同的行动。

  • 谢谢。首先,关于样式的评论。我*希望*人们接受,有时候或不可能不根据*他们*认为的最佳做法进行更改。只是以实际情况为准。特别是在这里,有问题的头文件是从外部来源提供的,我们在更改它们方面几乎没有灵活性,甚至没有灵活性。然后,我是团队中唯一使用Eclipse进行代码开发的人,因此该项目不会由于* my *问题而更改。尽管您对此事的“意见”很有价值并且受到赞赏,但也许应该将其放在答案的结尾。 (2认同)