C 言語 マクロ講座 可変個数引数編 ― 2007年03月22日 12時11分04秒
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");
最近のコメント