【问题标题】:Why does Eclipse CDT index a header file that's not in the path?为什么 Eclipse CDT 索引不在路径中的头文件?
【发布时间】:2015-11-10 19:33:56
【问题描述】:

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

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

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

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

My_Project
  |
  +-- Include_1
  |    |
  |    +-- header.h
  |
  +-- Include_2
  |    |
  |    +-- header.h
  |
  +-- Source
  |    |
  |    +-- module_1.c
  |
  +-- makefile

这两个变体大多相似,但包含一些差异。这些标头包含一些宏定义和一个enumerated typedef。具体来说,以下示例部件在两个变体中是相同的:

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

典型的代码模块包括这些头文件之一,具体取决于 makefile 中的配置,并包含对 SYMBOLconstant 的引用。

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

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

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

1.为什么我会收到这些索引器错误指示?

2。我怎样才能消除它们?

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

【问题讨论】:

  • 我不知道这个问题的答案,但是如果您在 SO 上没有得到好的答案,您可以尝试交叉发帖到 CDT 社区论坛:eclipse.org/forums/index.php/f/80 或者如果您使用的 DS5 是商业产品,我会直接向 ARM 请求帮助,因为许可费包括支持。
  • @JonahGraham - 谢谢。我在 Eclipse 论坛上的体验不是很好。通常,SO(和一般的 SE)是提出非主流问题的最佳场所。过去我确实使用过几次 ARM 帮助(事实上,他们当前的版本包括我报告的至少两个错误修复!)。我认为这个问题不是 ARM 特定的,其他 CDT 用户可能遇到过。无论如何,这可能是我的下一站。
  • 我同意你的所有观点,只是提供一些第二站,以防你在这里没有得到太多回应。我希望 ARM 也愿意修复 CDT 错误! PS,如果你在 GitHub 上贴一个 MCVE,我很乐意看看(我已经做了一段时间的 CDT 开发,只是没有立即对你的问题有答案)
  • @JonahGraham - 谢谢。什么是 MCVE?

标签: c include eclipse-cdt indexer


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 谢谢。首先,关于风格的评论。我希望人们接受有时不可能或不需要根据他们认为的最佳实践进行更改。就看情况吧。具体来说,有问题的头文件是从外部来源提供的,我们在更改它们方面几乎没有灵活性。然后,我是团队中唯一使用 Eclipse 进行代码开发的人,所以项目不会因为 my 问题而改变。尽管您对此事的意见很有价值且值得赞赏,但也许应该将其放在答案的末尾。
  • 第二,不,枚举是相同的。 Eclipse 定期索引标题,但正如我所指出的,我明确要求它不要,通过取消选中该选项。第三,排除一个标题是一个让我拍脑袋说“为什么我几周前没有想到这个......”的想法。虽然仍然是 Eclipse 中的一个错误,但排除解决了 my 问题,但我必须先禁用并重新启用索引器才能使其生效。你赢得了我的赏金!
  • @ysap ,您所说的似乎很多时候都是真的,但并不是每个人都接受这一点。我很久以前就在大型 SW 项目中使用 CDT,并且索引器始终无法正确获取某些问题。您只需要接受这一点,并避免花费太多时间来完善您的项目。 CDT 会随着时间的推移而改进,但这是一个缓慢的过程。不过,其他替代品缺少 eclipse 的功能。
  • 标记为派生不起作用。不过感谢您的提示,我不得不选择“C/C++ 构建”并选中“从构建中排除资源”,这很有效。
【解决方案2】:

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

  1. 如何消除它们?

我使用eclipse-cdt 进行开发,我也遇到过这种观察。我总是做以下其中一项,而且它经常对我有用。

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

【讨论】:

  • 谢谢。首先,奇怪的是知道这个问题不是我的情况所特有的。它希望它会在 Eclipse 项目本身中得到修复。现在,关于您的观点: 1. 澄清一下,我没有禁用整个索引器,只是禁用了所有可用选项。 2.在pf开发过程中,我必须在每次构建之前清理项目,因为它是一个Makefile项目,以强制重建库。我也多次尝试显式重新索引。 3. 由于其他问题不得不重新创建项目,但它并没有改变 this 的行为。 +1 建议
猜你喜欢
  • 2020-03-23
  • 2016-10-22
  • 2012-01-18
  • 1970-01-01
  • 1970-01-01
  • 2011-04-20
  • 2012-03-28
  • 2014-06-28
  • 1970-01-01
相关资源
最近更新 更多