va_start、va_end、va_arg


目次に戻る


今日は可変引数リスト関連をとりあげてみます。
 
標準関数の printf には引数をたくさん渡すことができます。これって不思議だと思っ たことありませんか?printf や scanf が使用している物が可変引数リストです。可変引数リストを使うと printf の様に引数を無限に受け取る事ができるのです。
 
とりあえず使用例を見てください。
void myfunc( char *format , ... )
{
    va_list ap;
    int idata;
    char cdata;

    va_start(ap,format);

    idata = va_arg( ap , int );
    cdata = va_arg( ap , char );

    va_end(ap);
}

注目すべきは1行目にある関数の宣言部です。第一引数はchar型へのポインタですが、 二つ目が ... となっています。この ... が可変引数を意味するのです。
 
可変引数としてうけとったデータを利用するには、まずva_startを呼び出して、関連デ ータ(va_list型)の初期化を行います。そして、可変引数をva_arg関数を使って一つずつ取 り出すのです。
 
va_arg関数の第2引数は引数の型です。もし、 myfunc( "test" , 100 ); という形で関数myfuncを呼び出したのならば、va_arg( ap , int );で「100」という数字を得、 myfunc( "test" , "go" ); という形で関数呼び出したのならば、 va_arg( ap , char* ); で「"go"」という文字列を得る必要があります。
 
これはつまり、引数の型があらかじめわかっていなければいけないという事です。
 
最後は va_end を呼び出して va_start で初期化したデータを解放する必要がありま す。


目次に戻る