可変長引数
C言語のプリプロセッサのマクロ定義において、可変長引数マクロには、以前はトリック的な方法が使われていたが、C99で本物の可変長引数マクロが標準化された。__VA_ARGS__という識別子を使用する。
次のような関数の呼び出しに展開されるマクロを定義したいとする。関数が可変長引数をとるため、機能を制限したくなければ、マクロも可変長引数をとるようにしたい。
C++での可変長引数マクロの設計に問題があるため、以下に示すような定義は行えない。
この書き方だと、dbgprintf("Hello")と記述した際にrealdbgprintf(__FILE__, __LINE__, "Hello", )と展開される。関数の引数リストをコンマで終えると構文エラーを起こすため、printfのような使い勝手は得られない。
gccの独自構文では##__VA_ARGS__という識別子もサポートしている。これを利用することにより引数がゼロ個のものも定義できる。
gcc以外でも使用するためには__VA_ARGS__を使うほかないが、その場合は書式文字列も含めて可変長引数として渡す必要がある。
Microsoft Visual C++の独自拡張モードでは、ゼロ個の引数を受け取る__VA_ARGS__は末尾コンマを抑制する動作をする。
C++20では、空の可変引数を処理するための__VA_OPT__マクロをサポートする。