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

标签 c eclipse c-preprocessor eclipse-cdt preprocessor

在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/

相关文章:

java - 导入静态org.joox.JOOX.* : - The import cannot be resolved

c - 如何使用以下预处理器语句

ios - 如何为自定义结构编写类似于 CGRectZero 的宏

使用 __VA_ARGS__ 连接字符串

c - valgrind 报告 mkl 的 dsyev 内存泄漏

eclipse - 在 Eclipse 中,为什么 "Build Automatically"会被神秘地禁用?

C 浮点运算在 i386 和 arm 上有不同的结果,但为什么呢?

java - Eclipse OnClickListener MainActivity 错误

c - 执行 ("/bin/sh", 0, 0);在管道中

iphone - 是否可以使用纯 C 在 iPhone 上捕获触摸事件?