.\" Copyright (c) 1990, 1991, 1993 .\" The Regents of the University of California. All rights reserved. .\" .\" This code is derived from software contributed to Berkeley by .\" the American National Standards Committee X3, on Information .\" Processing Systems. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. All advertising materials mentioning features or use of this software .\" must display the following acknowledgement: .\" This product includes software developed by the University of .\" California, Berkeley and its contributors. .\" 4. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" .\" @(#)stdarg.3 8.1 (Berkeley) 6/5/93 .\" %FreeBSD: src/share/man/man3/stdarg.3,v 1.4.2.5 2001/12/17 11:30:11 ru Exp % .\" $FreeBSD$ .\" .Dd June 5, 1993 .Dt STDARG 3 .Os .Sh 名称 .Nm stdarg .Nd 変数引数リスト .Sh 書式 .In stdarg.h .Ft void .Fn va_start "va_list ap" last .Ft type .Fn va_arg "va_list ap" type .Ft void .Fn va_end "va_list ap" .Sh 解説 関数はさまざまな型のさまざまな数の引数で呼び出せます。 インクルードファイル .Aq Pa stdarg.h は、型 .Pq Em va_list を宣言し、呼び出される関数には数字と型が 未知の引数リストをステップするために 3 つのマクロを定義します。 .Pp 呼び出される関数は、 .Em va_list 型のオブジェクトを宣言する必要があります。 これは、マクロ .Fn va_start , .Fn va_arg , .Fn va_end によって使用されます。 .Pp .Fn va_start マクロは、 .Fn va_arg と .Fn va_end が後に使用する .Fa ap を初期化し、 最初に呼び出す必要があります。 .Pp パラメータ .Fa last は変数引数リストの前の最後のパラメータの名前です。 すなわち、呼び出し関数が型を認識している最後のパラメータです。 .Pp このパラメータのアドレスは .Fn va_start マクロで使用されるので、 レジスタ変数または関数または配列型として宣言してはなりません。 .Pp .Fn va_start マクロは値を返しません。 .Pp .Fn va_arg マクロは、呼び出しの次の引数の型と値がある式に展開されます。 パラメータ .Fa ap は、 .Fn va_start によって初期化される .Em va_list Fa ap です。 .Fn va_arg の呼び出しごとに .Fa ap は修正され、次の呼び出しが次の引数を返します。 パラメータ .Fa type は、指定型のオブジェクトを指すポインタの型が * を .Fa type に追加するだけで得られるように指定された型名です。 .Pp 次の引数がない場合、または .Fa type が (デフォルトの引数生成に従って生成されたような) 実際の次の引数の型と互換性がない場合、 ランダムなエラーが発生します。 .Pp .Fn va_start マクロの後の最初の .Fn va_arg マクロの使用によって、 .Fa last の後の引数が返されます。 連続的な呼び出しによって、残りの引数の値が返されます。 .Pp .Fn va_end マクロは、変数引数リストが .Fn va_start によって初期化される関数の正常な 戻りを取り扱います。 .Pp .Fn va_end マクロは値を返しません。 .Sh 使用例 関数 .Em foo は、形式キャラクタのストリングを取り上げ、型を基礎にして各形式 キャラクタに対応する引数を印刷します。 .Bd -literal -offset indent void foo(char *fmt, ...) { va_list ap; int d; char c, *s; va_start(ap, fmt); while (*fmt) switch(*fmt++) { case 's': /* ストリング */ s = va_arg(ap, char *); printf("string %s\en", s); break; case 'd': /* 整数 */ d = va_arg(ap, int); printf("int %d\en", d); break; case 'c': /* キャラクタ */ /* 注意: キャラクタは整数を生成する。 */ c = va_arg(ap, int); printf("char %c\en", c); break; } va_end(ap); } .Ed .Sh 規格 .Fn va_start , .Fn va_arg , .Fn va_end の各マクロは .St -isoC に適合しています。 .Sh 互換性 これらのマクロは、置き換えられる歴史的なマクロと互換性がありま .Em せん 。 後方互換バージョンはインクルードファイル .Aq Pa varargs.h の中にあります。 .Sh バグ .Em varargs マクロと違って、 .Nm マクロでは、プログラマは、固定した引数のない 関数を作成することができません。この問題は、主に .Em varargs コードを .Nm コードに変換するときに作業を生じさせますが、 .Xr vfprintf 3 のように、 .Em va_list 引数を取る関数にすべての引数を渡そうとする各種の関数についても困難を 生じさせます。