为什么在Release版本中qDebug仍然有效?

27

我曾经使用 MFC,将 qDebug()TRACE() 视为相似的函数,认为它会在 Release 版本中被预处理器删除(在 MFC 中可以使用 #define TRACE 1 ? (void*) 0 : AfxTrace 实现)。

然而让我惊讶的是,qDebug() 在 Release 版本中也会被执行。我该如何更改这种行为?此外,为什么 Qt 的开发人员做出了这个决定,背后的原因是什么?


有用的链接:http://qt-project.org/forums/viewthread/25512 和 http://supportforums.blackberry.com/t5/Native-Development/Dealing-with-qDebug-in-release-candidate/td-p/2078713 - x29a
3个回答

30

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


那么为什么它不是默认设置的呢?他们一定有决定这样做的原因。 - sashoalm
我的猜测是人们并不总是小心区分stdin和stdout(请参见该答案的评论以及我在其下面的答案;原始答案仅包含第一个代码块),默认情况下导致调试版本与发布版本行为有很大不同是不好的做法。 - Kyle Strand

17

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。


4

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

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 我不知道为什么两种模式都禁用了调试输出。 - kien bui

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接