必须仅在调试版本中包含的源文件的条件编译

Dan*_*Dan 0 c embedded macros makefile conditional-compilation

我一直在阅读有关条件编译的最佳实践,但是我还没有找到关于这种情况的示例。

我有一个C项目,其目标平台是特定设备(不同于PC)。我有一个仅包含集成测试功能之类的源文件。我希望此文件仅在DEBUG构建而不是在构建中进行编译和链接RELEASE

我的问题是以下哪种选择是更好的做法:

一个*.c类似如下的文件:

Tests.c
---------
#ifndef NDEBUG
// All testing functions
...
#endif
Run Code Online (Sandbox Code Playgroud)

并在该文件DEBUGRELEASE构建文件中都包含该文件。

要么

检查是否NDEBUG从项目的内部定义Makefile / CMakeLists.txt并且因此包括提到的源文件。

Dev*_*lar 6

我对此的个人看法(!):

第一种方法#ifndef NDEBUG-是可取的。

最初有cc *.c

然后添加了适当的选项。

然后是构建系统,它想通了其中哪些*.c实际的文件需要重新编译,并且减轻你记住它的相应选项的

然后是更复杂的构建系统,可以为您找到合适的选项。

随着时间的流逝,构建系统变得越来越智能,并且可以容纳重要的逻辑。但是,我认为这种智能应该继续专注于其主要功能(请参见上文),并且-最终-a应该仍然在发挥作用cc *.c

构建系统已过时或被替换。下一个人甚至可能都不知道您选择的构建系统;他仍然应该能够在您的项目中脱颖而出,而不必深入研究构建系统的逻辑。

设置/检查NDEBUG是C,任何对语言(和<assert.h>)有过熟了解的人都将立即识别出您打算在那里进行的操作。

弄清楚为什么特定的源文件应该只包含在特定的构建类型中,而不包含在构建系统中的其他源文件中,这不是那么直观,并且在有人上任时可能会完全迷失,CMakeLists.txt因为他更喜欢Jam,从头开始构建。该人可能最终想知道为什么所有这些测试都会使他的发行代码混乱,以及为什么您不够聪明,无法将其设置为“仅调试”(没有意识到您确实在构建系统中做到了这一点)。