C 言語 マクロ講座 可変個数引数編2007年03月22日 12時11分04秒

C99 からの拡張で、マクロでも可変個数の引数がとれるようになった。

printf の様に可変個数の引数を渡して、ユーザに向けての色々なメッセージを構築することも多いので、vsnprintf 等を用いて、関数として一つずつ実装すると、それこそ同じようなコードがそこら中に散らばることになる。__VA_ARGS__ をサポートしていると、これをほぼ全てマクロで置き換えることが出来て大変効率的だ。


% cat vaargs.c
#define xprintf(...) printf(__VA_ARGS__)

xprintf("Hello %s\n", "World");

xprintf("%s %s\n", "Hello", "World");

プリプロセッサを通すとこうなる。


% gcc -E vaargs.c
# 1 "vaargs.c"
# 1 ""
# 1 ""
# 1 "vaargs.c"


printf("Hello %s\n", "World");

printf("%s %s\n", "Hello", "World");


もし、プリプロセッサが __VA_ARGS__ を実装していないのなら、マクロへの引数を括弧で括って、あたかも一つの変数の様に見せる方法もある。


% cat paran.c 
#define xprintf(args) printf args

xprintf(("Hello %s\n", "World"));

xprintf(("%s %s\n", "Hello", "World"));

残念ながら、この方法で逃げるしかないときもある。


% gcc -E paran.c
# 1 "paran.c"
# 1 ""
# 1 ""
# 1 "paran.c"


printf ("Hello %s\n", "World");

printf ("%s %s\n", "Hello", "World");

前回。次回