【发布时间】:2025-12-14 11:00:01
【问题描述】:
我一直在阅读条件编译的最佳实践,但我没有找到适合我的情况的示例。
我有一个 C 项目,其目标平台是特定设备(不同于 PC)。我有一个源文件,它只包含集成测试等功能。我希望仅在 DEBUG 构建中编译和链接此文件,而不是在 RELEASE 构建中。
我的问题是以下哪个选项更好:
A*.c 文件如下:
Tests.c
---------
#ifndef NDEBUG
// All testing functions
...
#endif
并将该文件包含在 DEBUG 和 RELEASE 构建中。
或者
检查NDEBUG 是否是从项目的Makefile / CMakeLists.txt 中定义的,因此包括提到的源文件。
【问题讨论】:
-
专业(但无用)的答案是:您的应用程序中根本不应该有任何调试编译器开关。调试与发布由版本控制 100% 处理。在实践中,我也使用这些开关......但混合调试和发布代码是一个坏习惯,因为它很容易在发布中滑倒并留下调试遗留物,尤其是在维护期间。
-
@Lundin 我不同意。如果您有相同事物的两个副本,它们肯定会不同步。最好的方法是使用像
ASSERT()这样的宏,它不会自动编译发布的调试代码。 -
@shawnhcorey 将主干中的更改合并到调试分支中相当简单。对于某些系统,要求在生产版本中不存在调试代码。一般来说,阅读带有大量编译器开关的代码是一件痛苦的事。说“只使用断言”很容易,但通常你想要的东西比单行布尔测试更复杂。
-
@Lundin 然后为它写一个宏。不要忘记
ASSERTs 也是文档。 -
@shawnhcorey 我通常的方法是将错误处理程序集成到程序本身中,然后使用它进行调试。但是,这是否可行当然取决于应用程序的性质。对于几乎所有的嵌入式系统,它都是。
标签: c makefile macros embedded conditional-compilation