【问题标题】:Why does qDebug work in Release builds?为什么 qDebug 在发布版本中工作?
【发布时间】:2012-11-09 18:39:13
【问题描述】:

来自 MFC,我对 qDebug() 的处理与 TRACE() 非常相似,假设它已由预处理器从发布版本中删除(在 MFC 中,它是使用 #define TRACE 1 ? (void*) 0 : AfxTrace 完成的)。

然而,令我惊讶的是,qDebug() 也在 Release 版本中执行。我该如何改变?还有,为什么会这样,Qt 的开发者做出这个决定的原因是什么?

【问题讨论】:

标签: c++ qt qdebug


【解决方案1】:

qDebug 也是预处理器控制的,但它有自己的特殊宏,QT_NO_DEBUG_OUTPUT。如果您将其添加到您的 Release 构建定义中,它将被删除。

【讨论】:

  • 那为什么不默认设置呢?他们做出这样的决定一定是有原因的。
  • @sashoalm 我的猜测是people aren't always careful to distinguish stdin from stdout(请参阅该答案上的 cmets 以及我在其下方的答案;原始答案仅包含第一个代码块),它将是默认情况下导致调试版本的行为与发布版本大不相同的不良做法。
【解决方案2】:

QDebug 是“调试信息的输出流”。它的默认行为是根据消息类型打印到 stdout/stderr。您可以通过安装自己的消息处理程序轻松自定义 qDebug() 行为。例如,如果要打印调试,可以在运行时(而不是编译时)进行测试。看看这个代码示例:

#include <QDebug>

void noMessageOutput(QtMsgType type, const char *msg)
{
     Q_UNUSED(type);
     Q_UNUSED(msg);
}

int main(int argc, char * argv[])
{
    QApplication app(argc, argv);

    if ( ! app.arguments().contains(QLatin1String("--with-debug") ) {
        qInstallMsgHandler(noMessageOutput);
    }
}

如果在运行时没有指定参数,它将隐藏整个 qDebug 输出。您可以获得更多的控制权,而不仅仅是“显示调试/不显示调试”

如果您担心代码中存在 qDebug 会导致性能下降,您也可以使用 QT_NO_DEBUG_OUTPUT 定义完全禁用 QDebug。

【讨论】:

    【解决方案3】:

    使用它可以在发布模式下抑制消息,但在调试模式下允许它们:

    CONFIG(release, debug|release):DEFINES += QT_NO_DEBUG_OUTPUT
    

    如果您只使用 DEFINES += QT_NO_DEBUG_OUTPUT 而不使用 CONFIG(...) 部分,您将在两种模式下都禁用它们,这通常是不可取的。

    【讨论】:

    • 我的配置:CONFIG += qt warn_off release CONFIG(release, debug|release):DEFINES += QT_NO_DEBUG_OUTPUT 我不知道为什么两种模式都禁用调试输出
    猜你喜欢
    • 1970-01-01
    • 2014-07-30
    • 1970-01-01
    • 2017-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-24
    相关资源
    最近更新 更多