不死身のqDebug

Qtに用意されているデバッグ表示用のマクロ qDebug。こいつはデフォルトではリリースビルドでもデバッグ表示の処理を行う。無効化したいなら、別途 QT_NO_DEBUG_OUTPUT を定義する必要がある。

ここまでは、まあ、よくある話だろう。

今回つまづいたのは:

  1. qDebug を消すために、リリースビルド時に QT_NO_DEBUG_OUTPUT を定義。
  2. デバッグ時に qDebug で使うだけのメンバ変数があったので、「#ifdef QT_DEBU」で囲み、リリースビルド時に消えるようにした。
  3. リリースビルド時に、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マクロのように消えてくれる訳ではないのか……。