EN JA
STDARG(3)
STDARG(3) FreeBSD Library Functions Manual STDARG(3)

名称

stdarg変数引数リスト

書式

#include < stdarg.h>

void
va_start( va_list ap, last);

type
va_arg( va_list ap, type);

void
va_copy( va_list dest, va_list src);

void
va_end( va_list ap);

解説

関数はさまざまな型のさまざまな数の引数で呼び出せます。インクルードファイル < stdarg.h> は、型 ( va_list) を宣言し、呼び出された関数に数と型が未知の引数リストを処置するための 3 つのマクロを定義します。

呼び出される関数は、マクロ va_start(), va_arg(), va_copy(), va_end() によって使用される、型 va_list のオブジェクトを宣言しなければなりません。

va_start() マクロは、 va_arg() と va_end() が後に使用する ap を初期化します。そして、最初に呼び出さなければなりません。

パラメータ last は変数引数リストの前の最後のパラメータの名前です。すなわち、呼び出し関数が型を認識している最後のパラメータです。

このパラメータのアドレスは va_start() マクロで使用されるので、レジスタ変数または関数または配列型として宣言してはなりません。

va_start() マクロは値を返しません。

va_arg() マクロは、呼び出しの次の引数の型と値がある式に展開されます。パラメータ ap は、 va_start() によって初期化された va_list ap です。 va_arg() の呼び出しごとに ap は修正され、次の呼び出しが次の引数を返します。パラメータ type は、指定された型名です。すなわち、単に type に * を加えることで得ることができる指定された型をもつオブジェクトを指す型です。

次の引数がない場合、または type が (デフォルトの引数促進に従って促進されたように) 実際の次の引数の型と互換性がない場合、ランダムなエラーが発生します。

va_start() マクロの後の va_arg() マクロの最初の使用によって、 last の後の引数が返されます。連続的な呼び出しによって、残りの引数の値を返します。

va_copy() マクロは src から dest まで、以前に va_start() で初期化された可変引数の並び (リスト) をコピーします。 src と共に使用される同じ 2 番目の引数での va_start() の呼び出しと、 src で呼び出されるように同じ回数での va_arg() の呼び出しが同等であるように状態は保存されます。

va_copy() マクロは値を返しません。

va_end() マクロは、変数引数リストが va_start() によって初期化された関数からの正常な戻りを取り扱います。

va_end() マクロは値を返しません。

使用例

関数 foo は、フォーマット文字の文字列を取り、型を基礎とした各フォーマット文字に関連する引数を印刷します。

void foo(char *fmt, ...) 
{ 
 va_list ap; 
 int d; 
 char c, *s; 
 
 va_start(ap, fmt); 
 while (*fmt) 
  switch(*fmt++) { 
  case 's':   /* string (文字列) */ 
   s = va_arg(ap, char *); 
   printf("string %s\n", s); 
   break; 
  case 'd':   /* int (整数) */ 
   d = va_arg(ap, int); 
   printf("int %d\n", d); 
   break; 
  case 'c':   /* char (文字) */ 
   /* 注意: char (文字) は int (整数) 
      に促進されます */ 
   c = va_arg(ap, int); 
   printf("char %c\n", c); 
   break; 
  } 
 va_end(ap); 
}

互換性

これらのマクロは、それらを置き換える歴史的なマクロと互換性がありません。後方互換バージョンはインクルードファイル < varargs.h> にあります。

規格

va_start(), va_arg(), va_copy(), va_end() マクロは、 ISO/IEC 9899:1999 (“ISO C99”) に適合しています。

バグ

varargs マクロと異なり、 stdarg マクロは、プログラマは、固定した引数のない関数をコード化することができません。この問題は、主に varargs コードを stdarg コードに変換するときに作業を生じますが、 vfprintf(3) のように、 va_list 引数をとる関数にそれらのすべての引数を渡そうとする可変引数の (variadic) 関数のための困難を生じます。
October 25, 2002 FreeBSD