快速确定C预处理器分支的方法

Quick way to determine the C preprocessor branches

本文关键字:处理器 分支 方法 预处理      更新时间:2023-10-16

当代码中有很多#if、#ifdef时。就像下面的情况一样

#ifdef CASE1                       
#ifdef CASE1_1
#define VALUE X
#else
#define VALUE Y
#endif
#else
#define VALUE Z
#endif

有没有一种方法可以快速确定代码将被编译到哪个分支。欢迎提出任何建议。感谢并致以最良好的问候

通过缩进可以更容易地读取嵌套的预处理器宏。大多数预处理器允许:


#ifdef foo
    #define bar (1)
#endif

但以下形式应该是普遍允许的:


#ifdef foo
#    define bar (1)
#endif

虽然这有助于跟踪嵌套,但它不能保证您能够发现哪个路径是活动的,特别是当您通过-D 将选项传递给编译器来进行定义时

一种解决方案是在源文件上运行预处理器并检查输出。您可以手动运行预处理器可执行文件(例如cpp),也可以在运行预处理器(例如gcc -E)后告诉编译器停止

这可以保证向您显示预处理器宏被替换的值。但是预处理器的输出可能很难跟上。

如果您只是试图跟踪一小段代码(如您的示例中所示),则可以手动执行,方法是自由插入#error(如果预处理器支持,则为#warning),并查看编译器转储的错误。这通常是最简单的选项,因为您不必对构建系统进行更改即可获得所需的可见性。

根据预处理器宏的复杂性,另一种选择是在源文件上运行另一个预处理器工具,该工具将生成比预处理器更友好的输出。我过去在filepp上取得过成功。

您可以将其识别为

#ifdef CASE1                       
#  ifdef CASE1_1
#    define VALUE X
#  else
#    define VALUE Y
#  endif
#else
#  define VALUE Z
#endif

编译器不会抱怨,目前Qt的qglobal.h中使用了相同的标识样式,它必须在许多平台上支持相当多的编译器。

一些IDE会突出显示"好的部分"或灰显"坏的部分";Visual Studio会这样做(不过,只有当它理解#define时!)

当然,您可以在源代码上运行预处理器并查看输出——例如,将-E切换为g++

不要信任Visual Studio。它使执行的代码变灰。很多时候,尤其是当您将项目设置中的预处理器宏与头文件中定义的宏混合时。

简单的方法?

#ifdef CASE1                       
#ifdef CASE1_1
#define VALUE X
const int branch = 1;
#else
#define VALUE Y
const int branch = 2;
#endif
#else
#define VALUE Z
const int branch = 3;
#endif

最后,您有一个变量,其值将告诉您在哪个分支中进行了编译。虽然不是很优雅,但它确实能满足您的要求,我猜您无论如何都需要它来进行调试:)