int func(int, ... ) { . . . } int main() { func(1, 2, 3); func(1, 2, 3, 4); }ファンクションfunc()は最後の引数を省略記号、すなわち3つのドット(...)とし、楕円の直前のものは常に可変引数の総数を表すintであることに留意すべきである。このような機能を使用するには、stdarg.hヘッダファイルを利用する必要があります。stdarg.hヘッダファイルは、可変引数の機能を実装するための関数とマクロを提供し、
- 最後のパラメータが省略記号である関数を定義し、省略記号の直前の引数は常に引数の数を表すintである。
- 関数定義にva_list型変数を作成します。この型はstdarg.hヘッダーファイルで定義されています。
- intパラメータとva_startマクロを使用して、va_list変数を引数リストに初期化します。マクロva_startは、stdarg.hヘッダーファイルで定義されています。
- 引数リストの各項目にアクセスするには、va_argマクロとva_list変数を使用します。
- va_list変数に割り当てられたメモリーをクリーンアップするには、マクロva_endを使用します。
上記の手順に従って、可変数のパラメータをとり、それらの平均を返すことのできる単純な関数を書き留めてみましょう
#include <stdio.h> #include <stdarg.h> double average(int num,...) { va_list valist; double sum = 0.0; int i; /* initialize valist for num number of arguments */ va_start(valist, num); /* access all the arguments assigned to valist */ for (i = 0; i < num; i++) { sum += va_arg(valist, int); } /* clean memory reserved for valist */ va_end(valist); return sum/num; } int main() { printf("Average of 2, 3, 4, 5 = %f\n", average(4, 2,3,4,5)); printf("Average of 5, 10, 15 = %f\n", average(3, 5,10,15)); }
上記のコードをコンパイルして実行すると、次の結果が生成されます。 function average()は2回呼び出され、最初の引数が渡される可変引数の総数を表すたびに呼び出されることに注意してください。 可変数の引数を渡すには、省略記号のみが使用されます。
Average of 2, 3, 4, 5 = 3.500000 Average of 5, 10, 15 = 10.000000
No comments:
Post a Comment