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言語