web-dev-qa-db-ja.com

qDebugがリリースビルドで機能するのはなぜですか?

MFCから来て、プリプロセッサによってリリースビルドから削除されると仮定して、qDebug()TRACE()と同じように扱いました(MFCでは#define TRACE 1 ? (void*) 0 : AfxTraceを使用して行われます)。

ただし、驚いたことに、qDebug()はリリースビルドでも実行されます。これを変更するにはどうすればよいですか?また、なぜそうなのか、この決定の背後にあるQtの開発者の理由は何でしたか?

21
sashoalm

qDebugもプリプロセッサで制御されますが、独自の特別なマクロQT_NO_DEBUG_OUTPUT。これをリリースビルド定義に追加すると、削除されます。

QDebugは「デバッグ情報の出力ストリーム」です。メッセージタイプに応じて、witchが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を完全に無効にすることができます。

16
Kamil Klimek

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

_CONFIG(release, debug|release):DEFINES += QT_NO_DEBUG_OUTPUT
_

CONFIG(...)部分なしで_DEFINES += QT_NO_DEBUG_OUTPUT_のみを使用する場合、両方のモードでそれらを無効にします。これは通常、望ましくありません。

3
V.K.