当代码中包含大量#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 上取得了成功过去。
关于c++ - 快速确定 C 预处理器分支的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9510217/