C - 可変引数
事前定義された数のパラメーターの代わりに、可変数の引数、つまりパラメーターを取ることができる関数が必要な場合に、状況に遭遇することがあります。 C プログラミング言語はこの状況の解決策を提供し、要件に基づいて可変数のパラメーターを受け入れることができる関数を定義することができます。次の例は、そのような関数の定義を示しています。
int func(int, ... ) { . . . } int main() { func(1, 2, 3); func(1, 2, 3, 4); }
関数 func() 最後の引数は楕円、つまり 3 つのドット (...) です。 ) であり、省略記号の直前のものは常に int です これは、渡された可変引数の総数を表します。このような機能を使用するには、stdarg.h を利用する必要があります。 変数引数の機能を実装し、指定された手順に従うための関数とマクロを提供するヘッダー ファイル −
- <リ>
最後のパラメータが省略記号で、省略記号の直前のパラメータが常に int である関数を定義する これは引数の数を表します。
<リ>va_list を作成する 関数定義で変数を入力します。この型は、stdarg.h ヘッダー ファイルで定義されています。
<リ>int を使用 パラメータと va_start va_list を初期化するマクロ 引数リストへの変数。マクロ va_start は、stdarg.h ヘッダー ファイルで定義されています。
<リ>va_arg を使用 マクロと va_list 引数リストの各項目にアクセスするための変数
<リ>マクロ va_end を使用する va_list に割り当てられたメモリをクリーンアップする
上記の手順に従って、可変数のパラメーターを取り、それらの平均を返すことができる単純な関数を書き留めましょう-
ライブデモ#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)); }
上記のコードをコンパイルして実行すると、次の結果が生成されます。関数 average() が 2 回呼び出され、そのたびに最初の引数が渡される可変引数の総数を表します。可変数の引数を渡すために省略記号のみが使用されます。
Average of 2, 3, 4, 5 = 3.500000 Average of 5, 10, 15 = 10.000000
C言語