17

C99 で不明な数のパラメーターを受け取る関数 (戻り値の型は定数) を (可能であれば) どうすれば記述できますか?

4

1 に答える 1

36

はい、Variadic 関数と呼ばれるものを使用して C で実行できます。たとえば、標準printf()scanf()関数がこれを行います。

パラメーターの可変数を配置する最後のパラメーターとして、省略記号 (3 つのドット) を配置します。

パラメータにアクセスするには、<stdarg.h>ヘッダーを含めます。

#include <stdarg.h>

そして、va_list渡された引数のリストを提供する特別な型があり、va_startva_argおよびva_endマクロを使用して引数のリストを反復処理できます。

例えば:

#include <stdarg.h>

int myfunc(int count, ...)
{
   va_list list;
   int j = 0;

   va_start(list, count); 
   for(j=0; j<count; j++)
   {
     printf("%d", va_arg(list, int));
   }

   va_end(list);

   return count;
}

呼び出しの例:

myfunc(4, -9, 12, 43, 217);

完全な例はWikipediaにあります。

このcount例のパラメーターは、呼び出された関数に渡される引数の数を伝えます。printf()とフォーマット文字列を介してそれをscanf()見つけますが、単純なcount引数でもそれを行うことができます。場合によっては、コードで負の整数やヌル ポインターなどのセンチネル値が使用されます ( execl() 例を参照)。

于 2012-04-09T09:19:28.943 に答える