Page List

Search on the blog

2011年9月6日火曜日

便利なマクロの使い方

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

マクロ名展開される値
#変数名
__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 件のコメント:

コメントを投稿