2012-11-21 16 views
15

TRACE()とよく似ていますが、これはプリプロセッサ(MFCでは#define TRACE 1 ? (void*) 0 : AfxTraceを使って行っています)によってリリースビルドから削除されているものとします。リリースビルドでqDebugが動作するのはなぜですか?

しかし、驚いたことに、qDebug()もリリースビルドで実行されます。これをどのように変更しますか? 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私の推測では、[人々は常にstdinとstdoutを区別するように常に注意しているわけではありません](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出力を非表示になります。

QT_NO_DEBUG_OUTPUTでQDebugを完全に無効にすると、コード内に存在するqDebugによるパフォーマンスの低下を懸念する場合にも定義できます。

0

はリリースモードでメッセージを抑制ますが、デバッグモードでそれらを可能にし、これを使用します。

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

あなただけDEFINES += QT_NO_DEBUG_OUTPUTCONFIG(...)部分なしを使用している場合は、通常は望ましくないとする、両方のモードでそれらを無効にします。

関連する問題