VARARGS(3) — NEWS-OS Programmer’s Manual
名称
varargs − 可変個数引数リスト
形式
#include <varargs.h>
function (va_alist)
va_dcl
va_list pvar;
va_start (pvar);
f = va_arg (pvar, type);
va_end (pvar);
解説
このマクロのセットは、 可変個数引数リストを 受け取る、 移植性のあるプロシージャを 書くための手段を 提供します。 varargs を 使用しない変可変個引数リストを 持つルーチン( printf(3S) など)は、 本来移植性がありません。 これは、 異なるマシンでは異なる引数受け渡し規定が使用されるためです。
va_alist は、 可変個数引数リストを 宣言するために、 関数頭部で使用されます。
va_dcl は、 va_alist のための宣言です。 va_dcl の後にはセミコロンを 付けないことに注意してください。
va_list は、 変数 pvar に対して使用する型です。 この変数は、 リストを順番に見ていくために使用されます。 このような変数が 1 個は必ず宣言されなければなりません。
va_start (pvar) は、 pvar を リストの先頭に初期化するために呼び出されます。
va_arg (pvar, type) は、 pvar によって指されたリスト中の次の引数を 返します。 type は、 引数として渡されたときに、 その引数が変換される型を 示します。 標準 C では、 char または short の引数は、 int としてアクセスされ、 unsigned char または unsigned short は、 unsigned int に変換されます。 また、 float 引数は、 double に変換されます。 異なる型の引数が混っていてもかまいませんが、 実行時に型を 決定するのは不可能であるため、 どの型の引数が使用されるのかは、 ルーチンで管理してください。
va_end (pvar) は、 終了に使用されます。
va_start ... va_end で囲むことにより、 何度でもリストを参照することが出来ます。
例
#include <varargs.h>
execl(va_alist)
va_dcl
{
va_list ap;
char ∗file;
char ∗args[100];
int argno = 0;
va_start(ap);
file = va_arg(ap, char ∗);
while (args[argno++] = va_arg(ap, char ∗))
;
va_end(ap);
return execv(file, args);
}
バグ
スタックフレームから引数の個数を 決定することは不可能であるため、 引数の個数は呼び出し側のルーチンで管理してください。 たとえば、 execl は、 リストの終わりのしるしとして 0 を 渡します。 printf は、 その書式から、 引数の個数を 推定することができます。
マクロ va_start および va_end は、 マシンのアーキテクチャの勝手な事情により 複雑になっていることがあります。 たとえば、 va_start が、 左中かっこ ‘{’ を含み、 それが va_end 中の対応する 右中かっこ ‘}’ によって閉じられるというように なっているかも知れません。 したがって、 これらは、一つの複合文の中だけで使用するようにしてください。
NEWS-OSRelease 4.2.1R