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

标签 c++ c

当代码中包含大量#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/

相关文章:

c++ - 遍历未知大小的数组 C++

c++ - 计算 FreeType 字形渲染的位置?

c - 在套接字编程中从客户端获取用户输入

c - k&r 中的 getint 模糊定义,其中 ungetch 的奇怪行为

c - 为什么这个程序一直显示结果?

c - GtkStatusBar 卡在一个/随机/位置并希望我将鼠标悬停按钮

c++ - QGraphicsScene/View 比例理解

c++ - 为什么在概念中使用std::forward?

c++ - popen() 和 printf 与 C++ 中的 cout 之间的奇怪交互

c - 编写 API 以与连接在串行端口上的设备进行通信