【C】可変長マクロで引数なしを受け渡すには ##__VA_ARGS__ (gcc拡張)

2015-03-04

C言語のマクロの引数の最後に ... を指定することで任意個の引数を取り、 __VA_ARGS__ で参照できる:

#define LOG(fmt, ...)  printf(fmt, __VA_ARGS__)

が、上記のように他の関数に渡す場合、可変部分は1個以上値を渡さないとエラーが出てしまう:

LOG("FOOBAR\n");  // <= コンパイルエラー

これは __VA_ARGS__ が空になり、マクロが単純に printf("FOOBAR\n", ); と置換されてしまうためである。

回避方法

gccだと ##__VA_ARGS__ というのを使えば、0個の場合でも受け渡せる:

#define LOG(fmt, ...)  printf(fmt, ##__VA_ARGS__)

追記:またはC++20でサポートされた? __VA_OPT__ で可変引数が0の場合に無視するトークンを指定できるとのこと:

#define LOG(fmt, ...)  printf(fmt __VA_OPT__(,) __VA_ARGS__)