我需要在C源代码中找到一些函数的调用。我正在使用Clang Python bindings。
问题是,这个解析器会忽略" inactive"内部的代码。 #ifdef
指令。我明白,这种行为是正确的(如果条件结果为False),但现在我只需要找到所有的调用,因为有些自动编辑。
#define CONST2
#ifdef CONST
f90()
#endif
f90()
#ifdef CONST2
f90()
#endif
解析器只会找到函数f90()
的第二次和第三次调用,而不是第一次调用,因为CONST
未定义。但我需要Clang才能找到第一个。
有没有办法改变这种Clang行为?
我没有有源代码问题。问题出在Clang解析器的设置中 - 无论未满足的条件如何,我都只需要解析整个代码。
好吧,我不认为Clang中有一个错误...我的问题是,如果Clang中有一些设置(可能是一些标志),那么它就会被忽略
代码解析期间的#ifdef
条件。
答案 0 :(得分:1)
不,无论预处理程序指令如何,都无法使大多数C语言分析器都能看到所有代码。可能有例外,但clang不是其中之一。
原因是编译器在两个单独的步骤中工作的方式。首先,预处理器解析预处理器指令。预处理器不知道C语法,它只知道预处理器语法。
然后编译器处理预处理的代码。编译器知道有关C语法的所有内容,其中一个任务就是查找语法错误。 如果您要将所有代码发送给它,那么应该由预处理器删除的代码可能会导致语法错误。
我建议你要么完全重新思考你的解决方案,要么补充你所拥有的一步,寻找隐藏在预处理器指令中的调用。除非代码设计不合理,否则不应该有这么多代码。
请注意,由于预处理器步骤可以执行代码操作,因此构建可以处理所有可能情况的工具非常困难。