如何仅在调试构建目标中制作一些代码 运行?

How to make some code run only in debug build target?

我想使用一些额外的代码来轻松调试和测试。但我不想将此代码添加到 "Release" 二进制文件中。 构建目标是否有一些已定义的预处理器符号?否则,我需要使用什么条件才能实现?

平时有什么问题#ifdef DEBUG?如果您编写自己的 make 文件,请确保为调试构建定义宏。

在 Code::Blocks 的 Project->Build options...Compiler Settings 选项卡中,我发现 #defines 选项卡并添加了我自己的调试目标符号。

我建议您创建自己的预处理器宏并根据额外代码的功能命名它,例如相当于

#define LOG_ALL_SQL 1

这样,您就可以打开和关闭正在使用的各个功能。你可能还有另一个,相当于

#define PRINT_STATUS 1

然后您可以调整调试,例如有时设置如下

#define LOG_ALL_SQL 1
#define PRINT_STATUS 0

以便记录 SQL 语句,但不会打印状态。

我将在软件中使用它们,如下例所示...

#if defined(LOG_ALL_SQL) && LOG_ALL_SQL 
    conditional SQL logging code here;
#endif // LOG_ALL_SQL

#if defined(PRINT_STATUS) && PRINT_STATUS 
    conditional status printing code here;
#endif // PRINT_STATUS

使用值(0 和 1,或 TRUE 和 FALSE 等)定义宏的优点是,如果某些调试功能因当前不需要该部分而关闭,定义仍然存在,因此是关于如何重新激活它的提醒,或者告诉您存在但当前未使用的调试软件。

用于调试的符号应在您的开发环境中为 Debug 版本(而不是 Release 版本)定义。

不要依赖预处理器,宏是完成这项工作的一种快速而肮脏的方法,如果这样做,请不要使用 DEBUGNDEBUG 宏。

原因:我见过不止一个人通过以下方式强制启用断言,即使在发布模式下也是如此(因此实际上这些宏有可能已经 setted/unsetted 被糟糕的设计代码所影响):

#undef NDEBUG
#include <assert.h>

那么,您是像 PROJECT_NAME_ENABLE_SOMETHING 这样定义自己的宏,还是只使用 custom logger(您将在发布模式下保持空实现,同时在调试期间打印一些有意义的内容)。

如果不小心使用 "debug only code",大多数时候会引入错误,当您的 "debug only code" 需要预处理器之外的东西时也会受到伤害,因为它会强制更改 "release code"有时编译器无法删除。

一般来说,您应该在应用程序的每个组件上执行 unit testing,而不是使用 "debug code".

来组合您的代码