7.4.10 <stdarg.h>

可変個の引数を持つ関数に対し、その引数の参照を可能にします。

 

以下はすべて処理系定義です。

種別

定義名

説明

(マクロ)

va_list

可変個の引数を参照するために、va_start, va_arg, va_endマクロで共通に使用される変数の型です。

関数

(マクロ)

va_start

可変個の引数の参照を行うため、初期設定処理を行います。

va_arg

可変個の引数を持つ関数に対して、現在参照中引数の次の引数への参照を可能とします。

va_end

可変個の引数を持つ関数の引数への参照を終了させます。

va_copy <-lang=c99>

可変個の引数をコピーします。

 

本標準インクルードファイルで定義しているマクロを使用したプログラムの例を以下に示します。

1 #include <stdio.h>

2 #include <stdarg.h>

3

4 extern void prlist(int count,...);

5

6 void main()

7 {

8 prlist(1, 1);

9 prlist(3, 4, 5, 6);

10 prlist(5, 1, 2, 3, 4, 5);

11 }

12

13 void prlist(int count,...)

14 {

15 va_list ap;

16 int i;

17

18 va_start(ap,count);

19 for(i=0;i<count;i++)

20 printf("%d",va_arg(ap,int));

21 putchar('\n');

22 va_end(ap);

23 }

 

【説明】

この例では、第1引数に出力するデータの数を指定し、以下の引数をその数だけ出力する関数prlistを実現しています。

18行目で、可変個の引数への参照をva_startで初期化します。その後引数を一つ出力するたびに、va_argマクロによって次の引数を参照します(20行目)。va_argマクロでは、引数の型名(この場合はint型)を第2引数に指定します。

引数の参照が終了したら、va_endマクロを呼び出します(22行目)。

 

va_start

可変個の実引数への参照を行うため、初期設定処理を行います。

 

[指定形式]

#include <stdarg.h>

void va_start(va_list ap, parmN);

 

[引数]

ap 可変個の引数にアクセスするための変数

parmN 最右端の引数の識別子

 

[備考]

va_startマクロは、va_arg、va_endマクロによって使用されるapの初期化を行います。また、parmNには、外部関数定義における引数の並びの最右端の引数の識別子、すなわち「,...」の直前の識別子を指定します。

可変個の名前のない引数を参照するためには、va_startマクロ呼び出しを一番初めに実行する必要があります。

 

va_arg

可変個の実引数を持つ関数に対して、現在参照中の引数の次の引数への参照を可能とします。

 

[指定形式]

#include <stdarg.h>

type va_arg(va_list ap, type) ;

 

[引数]

ap  可変個の引数にアクセスするための変数

type  アクセスする引数の型

 

[戻り値]

引数の値

 

[備考]

va_startマクロで初期化したva_list型の変数を第1引数に指定します。

apの値はva_argを使用する度に更新され、結果として可変個の引数が順次本マクロのリターン値として返されます。

第2引数typeは、参照する型を指定してください。

apはva_startによって初期化されたapと同じでなければなりません。

typeにchar型、unsigned char型、short型、unsigned short型、float型のように関数の引数に指定した時に型変換によってサイズが変わる型を指定した場合、正しく引数を参照することができなくなります。このような型を指定すると動作は保証しません。

 

va_end

可変個の実引数を持つ関数の引数への参照を終了させます。

 

[指定形式]

#include <stdarg.h>

void va_end(va_list ap) ;

 

[引数]

ap 可変個の引数を参照するための変数

 

[備考]

apはva_startによって初期化されたapと同じでなければなりません。また、関数からのreturn前にva_endマクロが呼び出されない時は、その関数の動作は保証しません。

 

va_copy

可変個の実引数を持つ関数に対して、現在参照中の引数の複製を作ります。

 

[指定形式]

#include <stdarg.h>

void va_copy(va_list dest, va_list src) ;

 

[引数]

dest 可変個の引数を参照するための変数の複製

src 可変個の引数を参照するための変数

 

[備考]

va_startマクロで初期化され、va_argで使用された可変個の引数の状態を持つ第2引数srcに対し、第1引数destに複製を作ります。

srcはva_startによって初期化されたsrcと同じでなければなりません。

destは、これ以降のva_argマクロで可変個の引数を表す引数として使用することができます。