va_list, va_start, va_arg, va_end - 可変パラメタ関数用マクロ
【書式】
#include <stdarg.h>
va_list ap;
void va_start(va_list ap, rightparm);
type va_arg(va_list ap, type);
void va_end(va_list ap);
【解説】
これらは可変パラメタ関数のパラメタを取り出すためのマクロです。
va_listは可変パラメタを順次取り出すためのポインタ型です。va_start(),
va_arg(), va_end()はマクロとして定義されています。
可変パラメタ関数は次のように宣言します。
type func(param1, param2, rightparam, ...);
可変パラメタ関数の中では、 まず va_list 型の変数 ap を宣言し、 次に
va_start() を呼んでその変数を初期設定します。rightparmには可変パラメ
タ関数の可変パラメタの部分(...) を除いたパラメタの中で一番右のパラメ
タを渡します。
パラメタを取り出すにはva_arg()を使います。va_start()によって初期設定
されたポインタapと取り出すパラメタの型を渡してva_arg()を呼び出すと、
その型のパラメタが 1つ取り出されます。va_arg()は呼び出されるごとに、
左から右へ1つずつパラメタを取り出します。
一連のパラメタ取り出しが終了した後にva_end()を呼んでください。
【使用例】
#include <stdarg.h>
#include <stdio.h>
void print(char *format, ...)
{
va_list ap;
char c, *p;
int i;
va_start(ap, format);
for (p = format; *p != '\0'; p++) {
switch (*p){
case 'C':
c = va_arg(ap, int);
putchar(c);
break;
case 'I':
i = va_arg(ap, int);
printf("%d", i);
break;
default:
putchar(*p);
}
}
va_end(ap);
}
【リターン値】
va_arg()は取り出したパラメタの値を返します。
【可搬性】
ANSI, DOS窓
【参照】
vprintf(3)
【バグ】
va_arg()を呼ぶ際に取り出すパラメタの型を指定しますが、可変パラメタ関
数のパラメタ変換規則に従っていますので注意してください。 たとえば、
char型のオブジェクトを取り出す場合、これはint 型にひろげられているの
でva_arg()のtypeはintを指定してください。
va_list ap;
char c;
...
c = va_arg(ap, int);
その他、 float は double にひろげられますので、 float 型のパラメタは
va_arg(ap, double)によって取り出す必要があります。
構造体をva_arg()によって取り出す場合には、ワード境界に整合されている
ことに注意してください。
【copyright (c) 安江正樹@東海大学理学部物理学科】