[C言語 標準ライブラリ] stdarg.hの使い方

stdarg.hには、printf 関数のような可変長引数に関する型、マクロ関数が宣言、定義されています。

スポンサーリンク

va_list

可変長引数にアクセスするための情報を格納する型です。

マクロ関数

void va_start(va_list ap, parmN)

可変長引数(実引数)の情報の取得を開始します。
実引数にアクセスする前に呼び出す必要があります。
va_start()以降に呼び出されるva_arg()、va_endの呼び出しに備えてva_list型のapを初期化します。
parmNは、仮引数の識別子(…)の直前の識別子です。
parmNがregister記憶域クラス、関数型、配列型、引数型変換を行った後の型が元の型と互換性が無い場合は、動作は未定義(環境依存)となります。

type va_arg(va_list ap, type)

可変長引数(実引数)を取得します。
2番目の引数(type)と同じ型の返り値を持つように展開されます。
va_list型のapはva_start()で初期化されたものでなければなりません。
va_arg()の実行によって、apは順番に引数を返すように変更されます。
引数の型typeは、実際の引数の型へのポインタ型であり、特定された型はtypeの前にポインタ(*)を添えることで取得できます。
va_start()実行後の最初のva_arg()の実行では、va_start()で指定したparmNの直後の引数の値を返します。
続けて実行すれば、残りの引数の値を順番に返します。

void va_end(va_list ap)

可変長引数(実引数)の取得を終了します。
va_list apを初期化したva_start()の展開によって参照された可変長引数をもつ関数からの正常な復帰を可能にします。
va_end()実行後はapが更新され使用できなくなる場合があります。(実装依存)

void va_copy(va_list dest, va_list src)

destにva_start()を適用し、それに続いてva_arg()を使った場合と同じ規則にしたがって、destをsrcのコピーとして初期化します。
destに対してva_end()が呼び出されることはありません。

コメント