我有一个由多个源模块和头文件组成的项目。其中两个(s1.c
,s2.c
)#include
相同的头文件(s3.h
)。该头文件包含基于外部定义的宏的条件编译构造:
#ifdef ExtMacro
#define IntMacro 1
#else
#define IntMacro 2
#endif
现在,ExtMacro
在s1.c
之前定义#include "s3.h"
,但在s2.c
中定义 。
在Eclipse编辑器中打开头文件时,将解析代码以进行语法突出显示,并从灰色背景中突出显示从构建中排除的部分。
如您所见,s3.h
的被排除部分取决于其包含的背景。但Eclipse选择其中一个包含模块以突出显示标题代码。
有没有办法让Eclipse在一个或另一个上下文中突出显示标题代码?
答案 0 :(得分:1)
如果您将标题添加到Preferences -> C/C++ -> Indexer -> "Index all variants of specific headers"
的列表中,则CDT将索引标题的两个版本。
然后按照s1.c
中的#include打开标题后,它会显示s1.c
上下文中索引的版本。当您按照s2.c
中的#include打开它时,它会显示在s2.c
上下文中编入索引的版本。
我不知道在没有上下文的情况下打开标题时控制显示哪个版本的方法(例如,通过Project Explorer)。
(而不是将标题添加到"Index all variants of specific headers"
列表,您也可以只查看"Index all header variants"
。但是,我不建议这样做,因为它可能会产生不利影响索引项目的性能。)
答案 1 :(得分:0)
您可以将ExtMacro设置为路径中的符号&符号。然后创建两个构建配置,一个配置ExtMacro,另一个配置不配置。然后在配置更改时将索引器设置为重新索引。通过切换配置,索引器将显示正确的上下文。
然后,您可能需要从索引器中排除s1.c
中的固定定义。 Eclipse CDT解析器生成一个可以触发并使用的预处理器符号:
#ifdef __CDT_PARSER__
#else
#define ExtMacro
#endif
这样,符号ExtMacro对于CDT解析器是隐藏的,而不是真正的编译器,它只从构建配置中获取符号。