在Eclipse CDT上构建Eclipse插件(不是使用CDT开发CXX),通过使用Eclipse CDT提供的API,对于下面的代码片段,在Eclipse CDT中,我们可以检测到ifdef statement(See IASTPressorIfStatement),但是我们如何才能获得这个 ifdef 指令下的语句。具体来说,在这个例子中,我们想要获取代码“#include”。或者有没有其他工具可以做到这一点?
#ifdef HAVE_SYS_PRCTL_H
#include <sys/prctl.h>
#endif
例如,在代码片段中,我们想要获取<#ifdef ...,#endif>结构中的语句。返回应该是“#include”。
对于正常情况,让代码片段如下:
#ifdef condition
statement A;
statement B;
.....
statement Z;
#endif
我要获取语句A,语句B,...和语句Z。*注意在预处理器语句中,像IASTPreprocessorIfdefStatement,我们可以提取宏名,但不能提取我提到的语句。
最佳答案
一般来说,#ifdef
block 内的区域不需要包含完整的声明(或者任何类型的完整 AST 节点)。例如,考虑:
int i =
#ifdef FOO
42
#else
43
#endif
;
这是有效的代码,但要求包含在 #ifdef
或 #else
分支中的声明没有意义,因为它们都不包含完整的声明。
我最好的建议是使用 ASTVisitor
遍历 AST,并将您感兴趣的节点的偏移量和长度与预处理器语句的偏移量和长度进行比较。 (节点的偏移量和长度可以通过 IASTNode.getFileLocation()
获得。)如果 AST 节点完全包含在一个 #ifdef
和一个 中#else
,你知道它在那个分支里面。如果 AST 节点与预处理器分支的边界重叠,则情况与我上面的示例类似,这取决于您要如何处理它。
关于c - Eclipse CDT 预处理器在条件下获取语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42712240/