Eclipse CDT预处理器在条件下获取语句

时间:2017-03-10 07:01:16

标签: c eclipse c-preprocessor eclipse-cdt preprocessor

在Eclipse CDT上构建Eclipse插件(不使用CDT开发CXX),通过使用Eclipse CDT提供的API,对于以下代码片段,在Eclipse CDT中,我们可以检测到ifdef statement(请参阅IASTPressorIfStatement),但我们如何获取此ifdef指令下的语句。具体来说,在这个例子中,我们想要获得代码" #include"。或者还有其他工具可以做到吗?

#ifdef HAVE_SYS_PRCTL_H
#include <sys/prctl.h>
#endif

例如,在代码段中,我们希望在结构中获取语句&lt; #ifdef ...,#endif&gt;。返回应该是&#34; #include&#34;。

对于正常情况,请让代码片段如下:

#ifdef  condition
 statement A;
 statement B;
 .....
 statement Z;
#endif

我想得到语句A,语句B,...和语句Z. *注意在预处理器语句中,如IASTPreprocessorIfdefStatement,我们可以提取宏名称但不提取我提到的语句。

1 个答案:

答案 0 :(得分:1)

通常,#ifdef块内的区域不需要包含完整的声明(或者确实包含任何类型的完整AST节点)。例如,考虑:

int i = 
#ifdef FOO
    42
#else
    43
#endif
    ;

这是有效的代码,但要求#ifdef#else分支中包含的声明没有意义,因为它们都不包含完整的声明。

我最好的建议是使用ASTVisitor来遍历AST,并将您感兴趣的节点的偏移量和长度与预处理器语句的偏移量和长度进行比较。 (可以通过IASTNode.getFileLocation()获得节点的偏移量和长度。)如果AST节点完全包含在#ifdef#else内,你知道它在里面那个分支。如果AST节点与预处理器分支的边界重叠,那么您处于上述示例的情况中,并且由您决定使用它。