C++ 言語 マクロ講座 可変個数引数編2011年01月20日 17時27分06秒

C++ で __VA_ARGS__ がどの様に動くのか調べてみた。C 言語では C99 で制定されているが、C++ ではどうなっているのかは、把握していない。C と C++ のプリプロセッサは、実装として同じものが使われている場合もあり、制定されていなくても動く場合が多い。

実験には C 言語 マクロ講座 可変個数引数編 と同じ物を使う。


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

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

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

幾つかのプラットフォームで試す。


sun % CC -E vaargs.cpp
#1 "vaargs.cpp"
#3 "vaargs.cpp"
printf ( "Hello %s\n" , "World" ) ; 

printf ( "%s %s\n" , "Hello" , "World" ) ; 
freebsd % g++ -E vaargs.cpp 
# 1 "vaargs.cpp"
# 1 ""
# 1 ""
# 1 "vaargs.cpp"


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

printf("%s %s\n", "Hello", "World");
hp % aCC -E vaargs.cpp 
#line 1 "vaargs.cpp"


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

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

ibm % xlC_r -E vaargs.cpp 
#line 3 "vaargs.cpp"
printf("Hello %s\n", "World");

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

FreeBSD, Solaris, IBM, HP で __VA_ARGS__ は展開されている。