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

Eclipse CDT preprocessor get statement under condition

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

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

例如,在代码片段中,我们想要获取<#ifdef ...,#endif>结构中的语句。 return 应该是“#include”。

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

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

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

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

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

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

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