呼び出される関数は、 va_list 型のオブジェクトを宣言する必要があります。 これは、マクロ Fn va_start , Fn va_arg , Fn va_end によって使用されます。
Fn va_start マクロは、 Fn va_arg と Fn va_end が後に使用する Fa ap を初期化し、 最初に呼び出す必要があります。
パラメータ Fa last は変数引数リストの前の最後のパラメータの名前です。 すなわち、呼び出し関数が型を認識している最後のパラメータです。
このパラメータのアドレスは Fn va_start マクロで使用されるので、 レジスタ変数または関数または配列型として宣言してはなりません。
Fn va_start マクロは値を返しません。
Fn va_arg マクロは、呼び出しの次の引数の型と値がある式に展開されます。 パラメータ Fa ap は、 Fn va_start によって初期化される va_list Fa ap です。 Fn va_arg の呼び出しごとに Fa ap は修正され、次の呼び出しが次の引数を返します。 パラメータ Fa type は、指定型のオブジェクトを指すポインタの型が * を Fa type に追加するだけで得られるように指定された型名です。
次の引数がない場合、または Fa type が (デフォルトの引数生成に従って生成されたような) 実際の次の引数の型と互換性がない場合、 ランダムなエラーが発生します。
Fn va_start マクロの後の最初の Fn va_arg マクロの使用によって、 Fa last の後の引数が返されます。 連続的な呼び出しによって、残りの引数の値が返されます。
Fn va_end マクロは、変数引数リストが Fn va_start によって初期化される関数の正常な 戻りを取り扱います。
void foo(char *fmt, ...) { va_list ap; int d; char c, *s; va_start(ap, fmt); while (*fmt) switch(*fmt++) { case 's': /* ストリング */ s = va_arg(ap, char *); printf("string %s\n", s); break; case 'd': /* 整数 */ d = va_arg(ap, int); printf("int %d\n", d); break; case 'c': /* キャラクタ */ /* 注意: キャラクタは整数を生成する。 */ c = va_arg(ap, int); printf("char %c\n", c); break; } va_end(ap); }