va_arg、va_end、va_start

可変個引数リストをアクセスします。

type va_arg(
   va_list arg_ptr,
   type 
);
void va_end(
   va_list arg_ptr 
);
void va_start(
   va_list arg_ptr,
   prev_param 
); // (ANSI version)
void va_start(
   arg_ptr 
);  // (Pre-ANSI-standardization version)

パラメーター

  • type
    取得する引数の型。

  • arg_ptr
    引数リストへのポインター。

  • prev_param
    最初の引数 (ANSI のみ) の前に含まれる ◇

戻り値

va_arg現在の引数を返します。 va_startva_endの値が返されません。

解説

va_argva_end、およびva_startマクロ関数が可変個の引数を受け取る場合、関数の引数にアクセスする汎用の手段を提供します。マクロの 2 つのバージョンが利用可能な: に従ってで定義されているマクロ。H は、ANSI C 規格に準拠しています。VARARGS で定義されたマクロを指定します。H は廃止され、の下位互換性を維持します。使用して ANSI の標準化を設計します。

これらのマクロ関数、省略可能な引数の変数番号が、必須の引数の数になることを前提としています。必須の引数は、通常、関数のパラメーターとして宣言されているし、パラメーター名でアクセスできます。省略可能な引数に従ってマクロを通じてアクセスします。H または可変引数。H は、ポインターを設定すると、[引数] ボックスの一覧で最初の省略可能な引数をリストから引数を取得し、引数の処理が完了したときに、ポインターをリセットします。

に従ってで定義された、ANSI C 標準マクロ。H は次のように使用されます。

  • va_start設定arg_ptr 、最初に引数リストで省略可能な引数が関数に渡さ。引数arg_ptrする必要がありますva_listタイプ。引数prev_paramは、引数リスト内の最初の省略可能な引数の直前に必須のパラメーターの名前です。場合prev_paramが宣言されているレジスタ ストレージ クラスでは、マクロの動作は未定義です。va_start前に使用する必要がありますva_argを最初に使用されます。

  • va_arg値を取得します。 typeで指定した位置からarg_ptrと単位arg_ptrのサイズを使用して、ボックスの一覧で、次の引数を指すtype 、次の引数が開始する位置を決定します。va_argことができます任意の数の関数内で、リストから引数を取得するために使用します。

  • すべての引数が取得された後は、 va_endへのポインターをリセット NULL

C++ メモ : C++ メモ

VARARGS で定義されたマクロを指定します。H は使用されなくし、だけの下位互換性は存在します。STDARGS で定義されているマクロを使用します。H は ANSI 標準の前にコードを使用している場合を除き。

コンパイルすると/clr (共通言語ランタイムのコンパイル)、これらのマクロを使用してプログラム可能性があります発生予期しない結果ネイティブと共通言語ランタイムの型システムの違いのため。このプログラムを検討してください。

#include <stdio.h>
#include <stdarg.h>

void testit ( int i, ...)
{
   va_list argptr;
   va_start(argptr, i);

   if ( i == 0 ) {
      int n = va_arg( argptr, int );
      printf( "%d\n", n );
   } else {
      char *s = va_arg( argptr, char* );
      printf( "%s\n", s);
   }
}

int main()
{
   testit( 0, 0xFFFFFFFF ); // 1st problem: 0xffffffff is not an int
   testit( 1, NULL );       // 2nd problem: NULL is not a char*
}

注意してくださいtestitは、2 番目のパラメーターを受け取る、 intまたはchar*。渡される引数は 0 xffffffff です (、 unsigned int、いない、 int) とNULL (実際には、 int、いない、 char*)。ネイティブ コードをコンパイルすると、プログラムには、出力が生成されます。

-1
(null)

ただし、コンパイルすると/clr:pure、プログラムの例外を生成するのには、型の不一致が発生します。明示的なキャストを使用する勧めします。

int main()
{
   testit( 0, (int)0xFFFFFFFF ); // cast unsigned to int
   testit( 1, (char*)NULL );     // cast int to char*
}

必要条件

ヘッダー: <stdio.h> <stdarg.h>

古いヘッダー: <varargs.h>

ライブラリ

C ランタイム ライブラリのすべてのバージョン。

使用例

// crt_va.c
/* The program below illustrates passing a variable
 * number of arguments using the following macros:
 *      va_start            va_arg              va_end
 *      va_list
 */

#include <stdio.h>
#include <stdarg.h>
int average( int first, ... );

int main( void )
{
   /* Call with 3 integers (-1 is used as terminator). */
   printf( "Average is: %d\n", average( 2, 3, 4, -1 ) );

   /* Call with 4 integers. */
   printf( "Average is: %d\n", average( 5, 7, 9, 11, -1 ) );

   /* Call with just -1 terminator. */
   printf( "Average is: %d\n", average( -1 ) );
}

/* Returns the average of a variable list of integers. */
int average( int first, ... )
{
   int count = 0, sum = 0, i = first;
   va_list marker;

   va_start( marker, first );     /* Initialize variable arguments. */
   while( i != -1 )
   {
      sum += i;
      count++;
      i = va_arg( marker, int);
   }
   va_end( marker );              /* Reset variable arguments.      */
   return( sum ? (sum / count) : 0 );
}

出力

Average is: 3
Average is: 8
Average is: 0

同等の .NET Framework 関数

System::ParamArrayAttribute クラス

参照

関連項目

引数へのアクセス

vfprintf、_vfprintf_l、vfwprintf、_vfwprintf_l