Oracle Solaris Studio 12.2: C ユーザーガイド

D.1.16 可変数の引数をとるマクロ

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));