我想使用一些额外的代码来轻松进行调试和测试。但我不想将此代码添加到"发布"二进制文件。 是否为构建目标定义了一些预处理器符号?否则,我需要用什么条件才能实现这个目标?
答案 0 :(得分:2)
我建议你创建自己的预处理器宏,并根据额外代码的功能命名,例如:相当于
的东西#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版本)定义用于调试的符号。
答案 1 :(得分:1)
通常的#ifdef DEBUG
有什么问题?如果您编写自己的make文件,请确保为调试版本定义宏。
答案 2 :(得分:0)
在项目中的代码::块 - >构建选项...... 编译器设置选项卡中,我找到了 #defines 标签并且我自己为Debug目标添加了符号。
答案 3 :(得分:0)
不依赖于预处理器,宏是一种快速而肮脏的方式来完成这项工作,如果这样做,请不要使用DEBUG
或NDEBUG
宏。
原因:我已经看到不止一个人在下面的方式中强制启用断言即使在释放模式下也是如此(因此实际上这些宏很可能已被设计错误的代码设置/取消设置):
#undef NDEBUG
#include <assert.h>
那么或者你定义自己的宏如PROJECT_NAME_ENABLE_SOMETHING
或者只是使用custom logger(你将在发布模式下保持为空实现,而在调试期间它会打印一些有意义的东西)。
如果不小心使用“仅调试代码”,大多数时候都会引入错误,当你的“仅调试代码”需要一些存在于预处理器之外的东西时它也会受到伤害,因为它强制改变“释放代码”,有时编译器会无法删除。
一般情况下,您应该使用“调试代码”对应用程序的每个组件执行unit testing。