MFCから来て、プリプロセッサによってリリースビルドから削除されると仮定して、qDebug()
をTRACE()
と同じように扱いました(MFCでは#define TRACE 1 ? (void*) 0 : AfxTrace
を使用して行われます)。
ただし、驚いたことに、qDebug()
はリリースビルドでも実行されます。これを変更するにはどうすればよいですか?また、なぜそうなのか、この決定の背後にあるQtの開発者の理由は何でしたか?
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を完全に無効にすることができます。
これを使用して、リリースモードでメッセージを抑制しますが、デバッグモードでは許可します。
_CONFIG(release, debug|release):DEFINES += QT_NO_DEBUG_OUTPUT
_
CONFIG(...)
部分なしで_DEFINES += QT_NO_DEBUG_OUTPUT
_のみを使用する場合、両方のモードでそれらを無効にします。これは通常、望ましくありません。