Cにおける可変パラメータ関数(va_list,va_start,va_arg,va_end)
3302 ワード
Technoratiラベル:va_list, va_start, va_arg, va_end
これの使用は非常に簡単ですが、manの一例で説明します.
出力:
y@y-VirtualBox:~/Training$ ./teststring Helloint 1char wchar wint 2string World!関数のプロトタイプ:
#include
void va_start(va_list ap, last);type va_arg(va_list ap, type);void va_end(va_list ap);void va_copy(va_list dest, va_list src);
注記:
va_List:タイプ、apすなわちargument pointer
va_start:apを初期化し、2番目の変数は...前の変数名でなければなりません.
va_Arg:vaを使用start(last,ap)初期化後、va_を初めて呼び出すargは、last後の変長パラメータテーブルの最初のパラメータを返し、apが次のパラメータを指すことを変更します.次にva_を呼び出すたびにargは、apを一歩前進させるパラメータを返します.va_argはapというパラメータポインタのほかに、一歩がどれだけ大きいかを決定するためにデータ型typeが必要です.
va_end:vaとstart対応
va_copyはva_をコピーするために使用されますlistの、使っていないで、ここでむやみに話さないで、間違いを免れて、わかる読者が私に教えてくれます~~
注意:
使用中に変長パラメータテーブル解析の終了条件を設定しなければならないが,可変パラメータは想像ほど知能的ではなく,すべてのパラメータのタイプと数を自動的に判断することはできない.したがって,使用する場合,パラメータの数を数値や条件でプログラムに知らせることが多い.例えば、上記の例のwhile(*fmt)が終了条件であり、次に数値境界を条件とする例を挙げる.
これの使用は非常に簡単ですが、manの一例で説明します.
#include <stdio.h>
#include <stdarg.h>
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
", s);
break;
case 'd'://int
d = va_arg(ap, int);
printf("int %d
", d);
break;
case 'c':
/* need a cast here since va_arg only takes fully promoted types */// , (char) , ?
c = (char)va_arg(ap, int);
printf("char %c
", c);
break;
}
va_end(ap);
}
int main()
{
foo("sdccds", "Hello", 1, 'w', 'w', 2, "World!");
return 0;
}
出力:
y@y-VirtualBox:~/Training$ ./teststring Helloint 1char wchar wint 2string World!関数のプロトタイプ:
#include
void va_start(va_list ap, last);type va_arg(va_list ap, type);void va_end(va_list ap);void va_copy(va_list dest, va_list src);
注記:
va_List:タイプ、apすなわちargument pointer
va_start:apを初期化し、2番目の変数は...前の変数名でなければなりません.
va_Arg:vaを使用start(last,ap)初期化後、va_を初めて呼び出すargは、last後の変長パラメータテーブルの最初のパラメータを返し、apが次のパラメータを指すことを変更します.次にva_を呼び出すたびにargは、apを一歩前進させるパラメータを返します.va_argはapというパラメータポインタのほかに、一歩がどれだけ大きいかを決定するためにデータ型typeが必要です.
va_end:vaとstart対応
va_copyはva_をコピーするために使用されますlistの、使っていないで、ここでむやみに話さないで、間違いを免れて、わかる読者が私に教えてくれます~~
注意:
使用中に変長パラメータテーブル解析の終了条件を設定しなければならないが,可変パラメータは想像ほど知能的ではなく,すべてのパラメータのタイプと数を自動的に判断することはできない.したがって,使用する場合,パラメータの数を数値や条件でプログラムに知らせることが多い.例えば、上記の例のwhile(*fmt)が終了条件であり、次に数値境界を条件とする例を挙げる.