Page List

Search on the blog

2011年9月6日火曜日

便利なマクロの使い方

STLライブラリのソースを読んでたら、見慣れないマクロがいくつかあったので、勉強しなおした。
便利そうなのをまとめておく。

マクロ名展開される値
#変数名
__FILE__ソースファイル名
__func__関数名
__LINE__ファイル内での行数

#はSRMでよく使用する。他の3つはより大規模な開発で重宝する。さらに、マクロは引数を(...)とすると、可変長引数を使用することができる。その際、可変長引数の参照は、__VA_ARGS__で行う。

以下、サンプル。
まずは、#を使った例。

  1. #define SHOW(x) cout << #x << ": " << x << endl;  
  2.   
  3. int main() {  
  4.     int x = 10;  
  5.   
  6.     ++x;  
  7.     SHOW(x);      // x: 11  
  8. }  


次に、ログ出力。

  1. #define DEBUG_PRINT(fmt, ...) \  
  2.     printf("In the function %s(), at line %d in %s\n", __func__, __LINE__, __FILE__); \  
  3.     printf(fmt, __VA_ARGS__)  
  4.   
  5. int doit(int x, int y) {  
  6.     int z = x + y;  
  7.   
  8.     DEBUG_PRINT("  x=%d, y=%d\n", x, y);    // In the function doit(), at line 12107 in ..\pku.cpp  
  9.     return z*z;                             //   x=10, y=10  
  10. }  
  11.   
  12. int main() {  
  13.     int x = 10;  
  14.     int y = 10;  
  15.   
  16.     int z = doit(x, y);  
  17.     cout << z << endl;  
  18. }  


3つ目の例では、ログ出力のオン、オフを切り替えれるようにします。マクロの内容そのものの定義を、DEBUG_MODEが定義されているか否かで切り替えています。この書き方はかっこいいですねー。しびれます。

  1. #define DEBUG_MODE  
  2.   
  3. #ifdef DEBUG_MODE      
  4. #define DEBUG_PRINT(fmt, ...) \  
  5.     printf("In the function %s(), at line %d in %s\n", __func__, __LINE__, __FILE__); \  
  6.     printf(fmt, __VA_ARGS__)  
  7. #else  
  8. #define DEBUG_PRINT(fmt, ...)  
  9. #endif  
  10.   
  11. int doit(int x, int y) {  
  12.     int z = x + y;  
  13.   
  14.     DEBUG_PRINT("  x=%d, y=%d\n", x, y);    // In the function doit(), at line 12107 in ..\pku.cpp  
  15.     return z*z;                             //   x=10, y=10  
  16. }  
  17.   
  18. int main() {  
  19.     int x = 10;  
  20.     int y = 10;  
  21.   
  22.     int z = doit(x, y);  
  23.     cout << z << endl;  
  24. }  

0 件のコメント:

コメントを投稿