为什么qDebug在Release版本中工作?

时间:2012-11-21 13:37:07

标签: c++ qt qdebug

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

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

3 个答案:

答案 0 :(得分:24)

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

答案 1 :(得分:16)

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 define完全禁用QDebug。

答案 2 :(得分:3)

使用此选项可以在发布模式下禁止消息,但允许它们处于调试模式:

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

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