Clang解析器 - 忽略指令#ifdef,解析所有内容

时间:2016-02-25 14:45:19

标签: c parsing clang llvm-clang

我需要在C源代码中找到一些函数的调用。我正在使用Clang Python bindings

问题是,这个解析器会忽略" inactive"内部的代码。 #ifdef指令。我明白,这种行为是正确的(如果条件结果为False),但现在我只需要找到所有的调用,因为有些自动编辑。

实施例

#define CONST2

#ifdef CONST
f90()
#endif

f90()

#ifdef CONST2
f90()
#endif

解析器只会找到函数f90()的第二次和第三次调用,而不是第一次调用,因为CONST未定义。但我需要Clang才能找到第一个。

有没有办法改变这种Clang行为?

编辑:

没有有源代码问题。问题出在Clang解析器的设置中 - 无论未满足的条件如何,我都只需要解析整个代码。

编辑2:

好吧,我不认为Clang中有一个错误...我的问题是,如果Clang中有一些设置(可能是一些标志),那么它就会被忽略

代码解析期间的#ifdef条件。

1 个答案:

答案 0 :(得分:1)

不,无论预处理程序指令如何,都无法使大多数C语言分析器都能看到所有代码。可能有例外,但clang不是其中之一。

原因是编译器在两个单独的步骤中工作的方式。首先,预处理器解析预处理器指令。预处理器不知道C语法,它只知道预处理器语法。

然后编译器处理预处理的代码。编译器知道有关C语法的所有内容,其中一个任务就是查找语法错误。 如果您要将所有代码发送给它,那么应该由预处理器删除的代码可能会导致语法错误。

我建议你要么完全重新思考你的解决方案,要么补充你所拥有的一步,寻找隐藏在预处理器指令中的调用。除非代码设计不合理,否则不应该有这么多代码。

请注意,由于预处理器步骤可以执行代码操作,因此构建可以处理所有可能情况的工具非常困难。