2011/07/16

ostreamの無効化

cppllを眺めていると、デバッグ出力用のコードを無効化にする話が議論されていました。[cppll:13624]
コード自体はいろいろあったのですが、その中の一つが次のコード。

#ifdef DEBUG
#define DOUT std::cout
#else
#define DOUT 0 && std::cout
#endif

DOUT <<  "debug"  << std::endl;
このコードのうまいところは、0 &&の残りが評価されないところらしい[cppll:13648]。dead-code eliminationというらしい。

何が凄いって、次のコードがgcc 4.4.5で-pedantic-errors -O0オプション付きでコンパイルできた。

bool f(); // 宣言だけ

int main() {
  if (false && f()) {
  } else {
    std::cout << "きえたよ" << std::endl;
  }
}
皆いろんなノウハウ持ってるなぁ...。

0 件のコメント: