Cにおける可変パラメータ関数(va_list,va_start,va_arg,va_end)

3302 ワード

Technoratiラベル:va_list, va_start, va_arg, va_end
これの使用は非常に簡単ですが、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)が終了条件であり、次に数値境界を条件とする例を挙げる.