다음을 통해 공유


가변 인수 목록을 사용하는 함수

변수 목록을 필요로 하는 함수는 가변 인수 목록에서 설명한 것처럼 줄임표(...)를 사용하여 선언됩니다. 변수 목록에서 전달한 인수에 액세스하기 위해 STDARG.H include 파일에서 설명한 형식과 매크로를 사용합니다. 이러한 매크로에 대한 자세한 내용은 C 런타임 라이브러리 설명서의 va_arg, va_end, va_start를 참조하십시오.

예제

다음 예제에서는 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 매크로를 호출하여 가변 인수 처리를 종료해야 합니다.

참고 항목

참조

C++ 함수 정의