便利そうなのをまとめておく。
マクロ名 | 展開される値 |
# | 変数名 |
__FILE__ | ソースファイル名 |
__func__ | 関数名 |
__LINE__ | ファイル内での行数 |
#はSRMでよく使用する。他の3つはより大規模な開発で重宝する。さらに、マクロは引数を(...)とすると、可変長引数を使用することができる。その際、可変長引数の参照は、__VA_ARGS__で行う。
以下、サンプル。
まずは、#を使った例。
#define SHOW(x) cout << #x << ": " << x << endl;
int main() {
int x = 10;
++x;
SHOW(x); // x: 11
}
次に、ログ出力。
#define DEBUG_PRINT(fmt, ...) \
printf("In the function %s(), at line %d in %s\n", __func__, __LINE__, __FILE__); \
printf(fmt, __VA_ARGS__)
int doit(int x, int y) {
int z = x + y;
DEBUG_PRINT(" x=%d, y=%d\n", x, y); // In the function doit(), at line 12107 in ..\pku.cpp
return z*z; // x=10, y=10
}
int main() {
int x = 10;
int y = 10;
int z = doit(x, y);
cout << z << endl;
}
3つ目の例では、ログ出力のオン、オフを切り替えれるようにします。マクロの内容そのものの定義を、DEBUG_MODEが定義されているか否かで切り替えています。この書き方はかっこいいですねー。しびれます。
#define DEBUG_MODE
#ifdef DEBUG_MODE
#define DEBUG_PRINT(fmt, ...) \
printf("In the function %s(), at line %d in %s\n", __func__, __LINE__, __FILE__); \
printf(fmt, __VA_ARGS__)
#else
#define DEBUG_PRINT(fmt, ...)
#endif
int doit(int x, int y) {
int z = x + y;
DEBUG_PRINT(" x=%d, y=%d\n", x, y); // In the function doit(), at line 12107 in ..\pku.cpp
return z*z; // x=10, y=10
}
int main() {
int x = 10;
int y = 10;
int z = doit(x, y);
cout << z << endl;
}
0 件のコメント:
コメントを投稿