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_listの変数を初期化するためのva_start。STDARG.H va_startマクロは、ヘッダファイルに定義されています。
- 各項目のパラメータのリストにアクセスするための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; /* 为 num 个参数初始化 valist */ va_start(valist, num); /* 访问所有赋给 valist 的参数 */ for (i = 0; i < num; i++) { sum += va_arg(valist, int); } /* 清理为 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 of 2, 3, 4, 5 = 3.500000 Average of 5, 10, 15 = 10.000000