2011/07/16

ostreamの無効化

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

  1. #ifdef DEBUG  
  2. #define DOUT std::cout  
  3. #else  
  4. #define DOUT 0 && std::cout  
  5. #endif  
  6.   
  7. DOUT <<  "debug"  << std::endl;  
このコードのうまいところは、0 &&の残りが評価されないところらしい[cppll:13648]。dead-code eliminationというらしい。

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

  1. bool f(); // 宣言だけ  
  2.   
  3. int main() {  
  4.   if (false && f()) {  
  5.   } else {  
  6.     std::cout << "きえたよ" << std::endl;  
  7.   }  
  8. }  
皆いろんなノウハウ持ってるなぁ...。

0 件のコメント: