2012-11-21 14 views
15

來自MFC,我認爲qDebug()非常像TRACE(),假設它從預處理器的發佈版本中刪除(在MFC中它使用#define TRACE 1 ? (void*) 0 : AfxTrace完成)。爲什麼qDebug在Release版本中工作?

然而,令我驚訝的是,qDebug()也在Release版本中執行。我該如何改變這一點?而且,爲什麼這樣呢,Qt的開發者在這個決定背後的推理是什麼?

+0

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

回答

22

qDebug也是預處理器控制的,但它有它自己的特殊宏,QT_NO_DEBUG_OUTPUT。如果您將其添加到您的發佈版本定義,它將被刪除。

+0

那麼爲什麼它沒有默認設置呢?他們必須有一個決定的理由。 – sashoalm

+0

@sashoalm我的猜測是[人們並不總是小心地區分標準輸入和標準輸出](http://stackoverflow.com/a/3886128/1858225)(請參閱對該答案的評論,以及我的答案,下面它;原始答案只包含第一個代碼塊),並且這將是一個糟糕的做法,導致調試版本的默認行爲與發佈版本的行爲大不相同。 –

+0

@KyleStrand你的意思是'stdout'和'stderr',對吧? – Angew

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輸出,如果沒有在運行時指定的參數。你可以獲得更多的控制,而不僅僅是「show debug/do not show debug」

你也可以通過QT_NO_DEBUG_OUTPUT完全禁用QDebug定義你是否擔心代碼中出現的qDebug性能下降。

0

使用此打壓的消息在發佈模式,但允許他們在調試模式:

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

如果你只使用DEFINES += QT_NO_DEBUG_OUTPUT沒有CONFIG(...)部分,你會在這兩種模式,這通常是不希望禁用它們。

相關問題