24

来自 MFC,我qDebug()非常喜欢TRACE(),假设它是由预处理器从 Release 构建中删除的(在 MFC 中它是使用 完成的#define TRACE 1 ? (void*) 0 : AfxTrace)。

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

4

3 回答 3

28

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

于 2012-11-21T13:47:31.700 回答
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 输出。您可以获得更多的控制权,而不仅仅是“显示调试/不显示调试”

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

于 2012-11-21T13:51:54.263 回答
3

Use this to suppress messages in release mode but allow them in debug mode:

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

If you use only DEFINES += QT_NO_DEBUG_OUTPUT without the CONFIG(...) part you will disable them in both modes, which is usually not desirable.

于 2018-02-10T12:12:34.033 回答