다음을 통해 공유


va_start, va_end, va_arg

변수 인수 목록을 액세스 합니다.

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_arg, va_end, 및 va_start 매크로 함수가 가변 개수의 인수를 사용 하면 함수에 인수에 액세스 하는 이식 가능한 방법을 제공 합니다.사용할 수 있는 두 가지 버전의 매크로: STDARG에 정의 된 매크로입니다.H는 ANSI C 표준에 준수 합니다.매크로에 VARARGS를 정의 합니다.H는 고립 되었으며 이전 버전과 호환성을 유지 합니다.사용할 ANSI 표준화 전에 만들었던.

이 매크로 함수는 고정 된 수의 필수 인수 뒤에 선택적 인수의 변수 번호를 사용 한다고 가정 합니다.필요한 인수 일반 함수 매개 변수로 선언 되며 매개 변수 이름을 통해 액세스할 수 있습니다.선택적 인수는 STDARG 매크로 통해 액세스할 수 있습니다.H 또는 VARARGS입니다.포인터 인수 목록의 첫 번째 인수를 설정 하는 H 인수 목록에서 검색 하 고 인수 처리가 완료 되 면 포인터를 다시 설정 합니다.

STDARG에 정의 된 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 기대로 두 번째 매개 변수는 int 또는 char*.0Xffffffff 전달 되는 인수는 (에 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 );
}

Output

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

해당 .NET Framework 항목

System::ParamArrayAttribute 클래스

참고 항목

참조

인수 액세스

vfprintf, _vfprintf_l, vfwprintf, _vfwprintf_l