Qtに用意されているデバッグ表示用のマクロ qDebug。こいつはデフォルトではリリースビルドでもデバッグ表示の処理を行う。無効化したいなら、別途 QT_NO_DEBUG_OUTPUT を定義する必要がある。
ここまでは、まあ、よくある話だろう。
今回つまづいたのは:
- qDebug を消すために、リリースビルド時に QT_NO_DEBUG_OUTPUT を定義。
- デバッグ時に qDebug で使うだけのメンバ変数があったので、「#ifdef QT_DEBU」で囲み、リリースビルド時に消えるようにした。
- リリースビルド時に、qDebug を使っている部分で、上記 (2) で消したメンバ変数がないためにビルドに失敗する。
――という現象。
QT_NO_DEBUG_OUTPUT を定義すれば qDebug のコードがキレイさっぱり消えるかと思いきや、Qt 5.4.1 の qDebug の定義を見てみたところ、そうではないようだ。
// QT_NO_DEBUG_OUTPUT 未定義時 #define qDebug QMessageLogger(QT_MESSAGELOG_FILE, QT_MESSAGELOG_LINE, QT_MESSAGELOG_FUNC).debug //QT_NO_DEBUG_OUTPUT 定義時 #define QT_NO_QDEBUG_MACRO while (false) QMessageLogger().noDebug #define qDebug QT_NO_QDEBUG_MACRO
QT_NO_DEBUG_OUTPUTの有無に関わらず qDebug の引数(「qDebug(hoge)」と書いた場合の「(hoge)」の部分)はプリプロセス後に残るようになっている。
うーん、MFCのTRACEマクロのように消えてくれる訳ではないのか……。