6.10.3 マクロ置換
C コンパイラで、次の形式の #define プリプロセッサ指令を使用することができます。
#define identifier (...) replacement_list #define identifier (identifier_list, ...) replacement_list |
マクロ定義で identifier_list が省略符号で終わる場合は、マクロ定義でのパラメータよりも呼び出しの引数の方が多いことを示します (省略符号を除く)。それ以外の場合は、マクロ定義でのパラメータ数 (プリプロセッサトークンのない引数を含む) が引数の個数と一致します。引数に省略符号表記を使用する #define のプリプロセッサ指令の置換リストで、識別子 __VA_ARGS__ を使用します。次のコードは、マクロの可変引数リスト機能の例です。
#define debug(...) fprintf(stderr, __VA_ARGS__) #define showlist(...) puts(#__VA_ARGS__) #define report(test, ...) ((test)?puts(#test):\ printf(__VA_ARGS__)) debug(“Flag”); debug(“X = %d\n”,x); showlist(The first, second, and third items.); report(x>y, “x is %d but y is %d”, x, y); |
この結果は、次のようになります。
fprintf(stderr, “Flag”); fprintf(stderr, “X = %d\n”, x); puts(“The first, second, and third items.”); ((x>y)?puts(“x>y”):printf(“x is %d but y is %d”, x, y)); |