可変個数の実引数 (Standard Argument)
ヘッダ ファイル |
stdarg.h |
---|---|
規格 | ANSI C (C89) / C90 |
概要 | 呼び出される関数の実引数の個数及び型が翻訳時には分からない場合に、その実引数並びを正しく処理するための 1 つの型を宣言し 4 つのマクロを定義する。フリースタンディング環境で利用可能。 |
可変個数引数を利用する関数は 1 つ以上の固定引数 (型がわかっている) と、複数の可変個数引数で構成される。可変個数引数は ...
で表される。
void foo(char *msg, ...);
K&R 等の古い処理系では varargs.h
となっており、C++Builder にも含まれています。但し、stdarg.h
と varargs.h
を同時にインクルードする事はできません。
プラグマ
型
名前 | 機能 |
---|---|
va_list | この配列には va_arg() と va_end() で必要になる情報が格納されています。 |
マクロ
引数付きマクロ
名前 | 機能 |
---|---|
va_arg() | 次に渡される引数(可変個数引数の 1 つ)と同じ型と値の式に展開されます。 |
va_copy() 1 | その時点の可変個数引数情報 (va_list) をコピーします。 コピー後はそれぞれ va_arg() で走査可能です。va_end() もそれぞれで呼び出す必要があります。 |
va_end() | 呼び出された関数が正常に戻るのに役立ちます |
va_start() | 関数に渡された可変個数引数の先頭を指すように ap を設定します。lastfix は、呼び出される関数に渡される最後の固定パラメータ (固定引数が一つなら最初のパラメータ) の名前です。 |
最初の固定引数が文字列、以降が int 型の可変個数引数の関数 foo()
の実装です。
void foo(char* msg, ...)
{
va_list ap;
int v;
va_start(ap, msg);
while ((v = va_arg(ap, int)) != -1) { // 番兵は -1
// 何かの処理
}
va_end(ap);
}
可変個数引数の個数を知る事はできないため、最後の引数に番兵 (-1) を置いて関数を呼び出します。
foo("Hello,world.", 1, 2, 3, -1);
See also:
関数
資料
- C 言語 / 標準ライブラリ / stdarg.h (Wikibooks)
- z/OS C/C++ ランタイム・ライブラリー・リファレンス stdarg.h — 可変長引数リストを持つ関数の引数へのアクセス (IBM)
- C 言語の標準ヘッダ一覧 stdarg.h (C 言語)
-
C99 で追加された。 ↩