変数は、引数リストと関数の引数
変数の一覧が必要な関数を 可変個引数リスト に説明されているように引数リストで省略記号 (...) を使用して宣言されます。型を使用すると STDARG.H に示すマクロは可変リストを渡された引数にアクセスするファイルが含まれます。これらのマクロの詳細についてはC ランタイム ライブラリのドキュメントで va_argva_endva_start を参照してください。
使用例
va_startva_arg と va_end マクロは va_list の型とともに使用例を次に示します。(STDARG.H で宣言された):
// variable_argument_lists.cpp
#include <stdio.h>
#include <stdarg.h>
// Declaration, but not definition, of ShowVar.
void ShowVar( char *szTypes, ... );
int main() {
ShowVar( "fcsi", 32.4f, 'a', "Test string", 4 );
}
// ShowVar takes a format string of the form
// "ifcs", where each character specifies the
// type of the argument in that position.
//
// i = int
// f = float
// c = char
// s = string (char *)
//
// Following the format specification is a variable
// list of arguments. Each argument corresponds to
// a format character in the format string to which
// the szTypes parameter points
void ShowVar( char *szTypes, ... ) {
va_list vl;
int i;
// szTypes is the last argument specified; you must access
// all others using the variable-argument macros.
va_start( vl, szTypes );
// Step through the list.
for( i = 0; szTypes[i] != '\0'; ++i ) {
union Printable_t {
int i;
float f;
char c;
char *s;
} Printable;
switch( szTypes[i] ) { // Type to expect.
case 'i':
Printable.i = va_arg( vl, int );
printf_s( "%i\n", Printable.i );
break;
case 'f':
Printable.f = va_arg( vl, double );
printf_s( "%f\n", Printable.f );
break;
case 'c':
Printable.c = va_arg( vl, char );
printf_s( "%c\n", Printable.c );
break;
case 's':
Printable.s = va_arg( vl, char * );
printf_s( "%s\n", Printable.s );
break;
default:
break;
}
}
va_end( vl );
}
コメント
前の例ではこれらの重要な概念を示しています :
変数引数の前に va_list 型の変数にアクセスするのと同時にリストのマーカーを確立する必要があります。前の例ではマーカーは vl と呼ばれます。
各引数は va_arg マクロを使用してアクセスします。スタックから正確なバイト数をコピーするに va_arg マクロに引数の型を取得するように指示する必要があります。va_arg に呼び出しプログラムによって指定されたのとは異なるサイズの不適切な型を指定すると結果は予測できません。
明示的に使用する型に va_arg マクロを使用して取得した結果をキャストする必要があります。
可変個の引数の処理を終了するに va_end マクロを呼び出す必要があります。