便利そうなのをまとめておく。
マクロ名 | 展開される値 |
# | 変数名 |
__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 件のコメント:
コメントを投稿