Cprogramming-c-variable-arguments

提供:Dev Guides
移動先:案内検索

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