함수에 가변 인수 목록
변수 목록은 함수 선언 된 인수 목록에서 줄임표 (...)를 사용 하 여 설명에 따라 가변 인수 목록.형식 및 STDARG에서 설명 하는 매크로 사용 합니다.H 파일 변수 목록으로 전달 되는 액세스 인수에 포함 됩니다.이러한 매크로 대 한 자세한 내용은 참조 하십시오. va_arg, va_end, va_start 에서 C 런타임 라이브러리에 대 한 설명서입니다.
예제
다음 예제는 어떻게 va_start, va_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 매크로 가변 인수 처리를 종료할 수 있습니다.