【问题标题】:How to make some code run only in debug build target?如何使某些代码仅在调试构建目标中运行?
【发布时间】:2015-07-14 08:59:12
【问题描述】:

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

【问题讨论】:

  • 通常取决于平台。调试版本定义了 DEBUG 或 _DEBUG 宏
  • 我都试过了,它们都是未定义的。顺便说一句,Windows7 平台

标签: c++ codeblocks wxwidgets


【解决方案1】:

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

#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 等)定义宏的优点是,如果某些调试功能由于当前不需要该部分而关闭,则定义仍然存在,因此存在提醒如何重新激活它,或者告诉您存在哪些调试软件但当前未使用。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 问题在于规范模式是#ifndef NDEBUG。大多数编译器在调试版本中自动取消定义NDEBUG
    • 嗯,我经常看到#ifdef DEBUG,偶尔也看到NODEBUG。甚至想不起来我最后一次看到它是什么时候。
    • Windows 7 上的 GCC-TDM 根本没有这个符号。
    • 这当然是-D 开关的用途! :) 编译器怎么知道你是要调试还是发布版本???
    • 项目->构建选项->发布->#定义
    【解决方案3】:

    Project->Build options...Compiler Settings 选项卡中的 Code::Blocks 中,我找到了 #defines 选项卡和我自己为 Debug 目标添加了符号。

    【讨论】:

      【解决方案4】:

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

      原因:我看到不止一个人通过以下方式强制启用断言,即使是在发布模式下(因此实际上这些宏很有可能已经被糟糕的设计代码设置/取消设置):

      #undef NDEBUG
      #include <assert.h>
      

      那么,您是定义自己的宏,例如PROJECT_NAME_ENABLE_SOMETHING,还是只使用custom logger(在发布模式下您将保持为空实现,而在调试期间它会有意义地打印一些内容)。

      如果不小心使用“仅调试代码”,大多数情况下会引入错误,当您的“仅调试代码”需要位于预处理器之外的东西时也会造成伤害,因为它会强制更改“发布代码”,有时编译器会这样做无法删除。

      一般而言,您应该在应用程序的每个组件上执行unit testing,以便将您的代码与“调试代码”结合在一起。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-02
        • 2012-05-16
        相关资源
        最近更新 更多