C 如何根据不同的源模块上下文突出显示公共头文件?

C 如何根据不同的源模块上下文突出显示公共头文件?,c,eclipse,syntax-highlighting,eclipse-cdt,conditional-compilation,C,Eclipse,Syntax Highlighting,Eclipse Cdt,Conditional Compilation,我有一个由几个源模块和头文件组成的项目。其中两个(s1.c,s2.c)包含相同的头文件(s3.h)。该头文件包含基于外部定义宏的条件编译构造: #ifdef ExtMacro #define IntMacro 1 #else #define IntMacro 2 #endif 现在,ExtMacro在#include“s3.h”之前的s1.c中定义,但在s2.c中未定义 在Eclipse编辑器中打开头文件时,将解析代码以突出显示语法,并以灰色背景突出显示从构建中排除的部分 如您所见,s3.h的

我有一个由几个源模块和头文件组成的项目。其中两个(
s1.c
s2.c
包含相同的头文件(
s3.h
)。该头文件包含基于外部定义宏的条件编译构造:

#ifdef ExtMacro
#define IntMacro 1
#else
#define IntMacro 2
#endif
现在,
ExtMacro
#include“s3.h”
之前的
s1.c
中定义,但在
s2.c
中未定义

在Eclipse编辑器中打开头文件时,将解析代码以突出显示语法,并以灰色背景突出显示从构建中排除的部分

如您所见,
s3.h
的排除部分取决于其包含的上下文。但是Eclipse选择其中一个包含模块来突出显示头代码


有没有办法告诉Eclipse在一个上下文或另一个上下文中突出显示标题代码?

您可以将ExtMacro设置为路径和符号中的符号。然后创建两个构建配置,一个定义ExtMacro,另一个不定义ExtMacro。然后,当配置更改时,将索引器设置为重新索引。通过切换配置,索引器将显示正确的上下文

然后您可能需要从索引器中排除
s1.c
中的固定定义。Eclipse CDT解析器生成一个预处理器符号,您可以在该符号上触发并使用:

#ifdef __CDT_PARSER__
#else
#define ExtMacro
#endif

这样,symbol ExtMacro对于CDT解析器而不是真正的编译器是隐藏的,它只从构建配置中提取符号。

如果您在
首选项->C/C++->Indexer->“索引特定头的所有变体”
中将头添加到列表中,则CDT将索引头的两个版本

然后,当您按照#include in
s1.c
打开标题时,它将显示在
s1.c
上下文中索引的版本。当您按照#include in
s2.c
打开它时,它将显示在
s2.c
上下文中索引的版本

我不知道如何控制在没有上下文的情况下打开标题时显示哪个版本(例如,通过Project Explorer)


(除了将标题添加到
“为特定标题的所有变体编制索引”
列表中之外,您还可以只选中
“为所有标题变体编制索引”
。但是,我不建议这样做,因为这可能会对为项目编制索引的性能产生不利影响。)

这是一个与索引器相关的问题。尝试在项目属性->C/C++常规->索引器中修改它的设置。但我对此并不乐观。谢谢。这个想法很有趣,但实际的文件是一个由程序员团队开发的项目的生产代码(我是唯一一个使用Eclipse进行开发的人)。我不拥有该模块,也不想更改代码。@ysap您不必提交更改,如果您只想正确查看
.h
文件,它可能在不排除的情况下工作。但是,您每次拉动更改时都必须重复该过程,不是吗?(或者,经历一些繁琐的合并过程。)@ysap你必须从三个邪恶中选择较小的一个。没有完美的方法,这是最好的答案提示,提示你可能会得到。对于工作场所的答案,我会得到一块糖果,并用它贿赂s1.c的程序员。谢谢。这听起来像是问题的解决办法,尽管在问了差不多两年之后,我真的不记得那个问题的背景了。我将尝试在我们的工作区中为其生成一个测试用例,以批准答案。