Clang 解析器 - 忽略指令 #ifdef,解析所有内容
Clang parser - ignore directive #ifdef, parse everything
我需要在 C 源代码中查找某些函数的调用。我为此使用 Clang Python bindings。
问题是,此解析器忽略了“非活动”#ifdef
指令中的代码。我明白,这种行为是正确的(如果条件结果为 False),但现在我只需要它来查找所有调用,因为有一些自动编辑。
示例:
#define CONST2
#ifdef CONST
f90()
#endif
f90()
#ifdef CONST2
f90()
#endif
解析器将只找到函数 f90()
的第二次和第三次调用,而不是第一次调用,因为 CONST
未定义。但是我需要 Clang 才能找到第一个。
有什么方法可以改变这种 Clang 行为吗?
编辑:
我不源代码有问题。问题出在 Clang 解析器的设置中——我只需要它来解析整个代码,而不管未满足的条件。
编辑 2:
好的,我认为 Clang 中没有错误...我的问题是,如果 Clang 中有一些设置(可能是一些标志),那么它会在代码解析期间忽略 #ifdef
条件.
不,没有办法让大多数 C 解析器查看所有代码而不考虑预处理器指令。可能会有例外,但 clang 不是其中之一。
原因在于编译器分两步工作的方式。首先,预处理器解析预处理器指令。预处理器对C语法一无所知,它只知道预处理器语法。
然后编译器对预处理后的代码进行处理。编译器知道关于 C 语法的一切,它的工作之一就是查找语法错误。
如果您将所有代码都发送给它,则本应被预处理器删除的代码很可能会导致语法错误。
我建议您要么完全重新考虑您的解决方案,要么通过查找隐藏在预处理器指令中的调用的步骤来补充现有解决方案。除非代码设计得不好,否则不应该有这么多。
请注意,由于预处理器步骤可以进行代码操作,因此很难构建一个可以处理所有可能情况的工具。
我需要在 C 源代码中查找某些函数的调用。我为此使用 Clang Python bindings。
问题是,此解析器忽略了“非活动”#ifdef
指令中的代码。我明白,这种行为是正确的(如果条件结果为 False),但现在我只需要它来查找所有调用,因为有一些自动编辑。
示例:
#define CONST2
#ifdef CONST
f90()
#endif
f90()
#ifdef CONST2
f90()
#endif
解析器将只找到函数 f90()
的第二次和第三次调用,而不是第一次调用,因为 CONST
未定义。但是我需要 Clang 才能找到第一个。
有什么方法可以改变这种 Clang 行为吗?
编辑:
我不源代码有问题。问题出在 Clang 解析器的设置中——我只需要它来解析整个代码,而不管未满足的条件。
编辑 2:
好的,我认为 Clang 中没有错误...我的问题是,如果 Clang 中有一些设置(可能是一些标志),那么它会在代码解析期间忽略 #ifdef
条件.
不,没有办法让大多数 C 解析器查看所有代码而不考虑预处理器指令。可能会有例外,但 clang 不是其中之一。
原因在于编译器分两步工作的方式。首先,预处理器解析预处理器指令。预处理器对C语法一无所知,它只知道预处理器语法。
然后编译器对预处理后的代码进行处理。编译器知道关于 C 语法的一切,它的工作之一就是查找语法错误。 如果您将所有代码都发送给它,则本应被预处理器删除的代码很可能会导致语法错误。
我建议您要么完全重新考虑您的解决方案,要么通过查找隐藏在预处理器指令中的调用的步骤来补充现有解决方案。除非代码设计得不好,否则不应该有这么多。
请注意,由于预处理器步骤可以进行代码操作,因此很难构建一个可以处理所有可能情况的工具。