快速确定C预处理器分支的方法
Quick way to determine the C preprocessor branches
当代码中有很多#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++
。
简单的方法?
#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
最后,您有一个变量,其值将告诉您在哪个分支中进行了编译。虽然不是很优雅,但它确实能满足您的要求,我猜您无论如何都需要它来进行调试:)
- #定义c-预处理器常量..我做错了什么
- 预处理器:插入结构名称中的前一个行号
- 如何在c++中实现处理器调度模拟器
- IPC使用多个管道和分支进程来运行Python程序
- C/C++预处理器是否可以检测一些编译器选项
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 如何删除peer if else分支中的冗长句子
- 如何确保在使用基于布尔值的两个方法之一调用方法时避免分支预测错误
- 在clang++预处理器中确定gcc工具链版本
- 不同/较旧的处理器运行c++代码的方式是否不同
- 如何正确地将分支添加到已存在的树中
- 用于交叉编译和CMake的预处理器宏的单元测试
- 如何将分支添加到已存在的TTree:ROOT
- 有没有办法在从编译器获取参数时避免预处理器宏?
- 如何比较两个同名的预处理器宏?
- 从预处理器获取 Windows 版本(C++ Win32)
- 如何摆脱为条件编译定义预处理器宏的需要?
- 如何删除 LLVM 中的不规则分支?
- 快速确定C预处理器分支的方法
- 氧是否支持分支或C/ c++预处理器?