可変個の引数を持つ関数に対し、その引数の参照を可能にします。
本標準インクルードファイルで定義しているマクロを使用したプログラムの例を以下に示します。
4 extern void prlist(int count,...);
20 printf("%d",va_arg(ap,int));
この例では、第1引数に出力するデータの数を指定し、以下の引数をその数だけ出力する関数prlistを実現しています。
18行目で、可変個の引数への参照をva_startで初期化します。その後引数を一つ出力するたびに、va_argマクロによって次の引数を参照します(20行目)。va_argマクロでは、引数の型名(この場合はint型)を第2引数に指定します。
引数の参照が終了したら、va_endマクロを呼び出します(22行目)。
void va_start(va_list ap, parmN);
va_startマクロは、va_arg、va_endマクロによって使用されるapの初期化を行います。また、parmNには、外部関数定義における引数の並びの最右端の引数の識別子、すなわち「,...」の直前の識別子を指定します。
可変個の名前のない引数を参照するためには、va_startマクロ呼び出しを一番初めに実行する必要があります。
可変個の実引数を持つ関数に対して、現在参照中の引数の次の引数への参照を可能とします。
type va_arg(va_list ap, type) ;
va_startマクロで初期化したva_list型の変数を第1引数に指定します。
apの値はva_argを使用する度に更新され、結果として可変個の引数が順次本マクロのリターン値として返されます。
apはva_startによって初期化されたapと同じでなければなりません。
typeにchar型、unsigned char型、short型、unsigned short型、float型のように関数の引数に指定した時に型変換によってサイズが変わる型を指定した場合、正しく引数を参照することができなくなります。このような型を指定すると動作は保証しません。
apはva_startによって初期化されたapと同じでなければなりません。また、関数からのreturn前にva_endマクロが呼び出されない時は、その関数の動作は保証しません。
可変個の実引数を持つ関数に対して、現在参照中の引数の複製を作ります。
void va_copy(va_list dest, va_list src) ;
va_startマクロで初期化され、va_argで使用された可変個の引数の状態を持つ第2引数srcに対し、第1引数destに複製を作ります。