다음을 통해 공유


va_arg, va_copy, va_end, va_start

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

type va_arg(
   va_list arg_ptr,
   type 
);
void va_copy(
   va_list dest,
   va_list src
); // (ISO C99 and later)
void va_end(
   va_list arg_ptr 
);
void va_start(
   va_list arg_ptr,
   prev_param 
); // (ANSI C89 and later)
void va_start(
   arg_ptr 
);  // (Pre-ANSI C89 standardization version)

매개 변수

  • type
    검색할 인수의 형식입니다.

  • arg_ptr
    인수 목록에 대한 포인터입니다.

  • dest
    이 src 으로 초기화에 대한 인수 목록에 대한 포인터

  • src
    이 dest 복사하는 인수의 초기화 목록에 대한 포인터.

  • prev_param
    첫째 선택적 인수 앞에 매개 변수입니다.

반환 값

va_arg 현재 인수를 반환합니다. va_copy, va_startva_end 은 값을 반환 하지 않습니다.

설명

va_arg, va_copy, va_end, va_start 이 매크로 함수 인수의 변수 번호를 사용하면 함수에 인수에 액세스하려면 휴대용 방법을 제공합니다. 두 가지 버전의 매크로: STDARG에 정의된 매크로입니다 : 이 매크로는 ISO C99 표준의로 준수된 STDARG.H 로 정의되어 있습니다; 이 매크로는 사용되지 않은 VARARGS.H 로 정의되어 있으나 ANSI C89 표준 이전에 쓰여진 코드와 호환성이 유지 됩니다.

이 매크로 함수는 고정된 수의 선택적 인수의 변수 번호 뒤에 필수 인수를 사용한다고 가정합니다. 인수는 함수를 일반 매개 변수로 선언되고 매개 변수 이름을 통해 액세스할 수 있습니다. 선택적 인수는 인수 목록의 첫번째 선택적 인수의 포인터로, 목록으로 부터 검색된 인수들로, 인수 처리가 완료되면 포인터가 다시 설정으로, 설정된 STDARG.H (혹은 ANSI C89 표준 이전에 쓰여진 코드의 VARARGS.H) 를 통해 액세스됩니다.

STDARG.H 에 정의된 C표준 매크로는 다음과 같이 사용됩니다:

  • va_start 는 함수에 전달되는 인수 목록에서 첫째 선택적 인수를 arg_ptr 으로 설정합니다. 인수 arg_ptr 는 반드시 va_list 형식을 가집니다. 인수 prev_param 는 이름 바로 인수 목록에서 첫째 선택적 인수 앞에 필수 매개 변수입니다. 이 prev_param 매크로 동작은 정의 되지 않는 경우, 등록 저장소 클래스를 사용하여 선언 합니다. va_startva_arg 이 처음으로 사용되기 전에, 사용되어야 합니다.

  • va_arg 은 arg_ptr 으로 받아진 지역으로 부터 type 값을 검색하고, 다음 인수의 시작 위치를 결정하는 type 목록의 다음 인수의 포인터인 arg_ptr 로 증가합니다. va_arg 은 수 목록에서 인수를 검색하려면 함수에 여러 번 사용합니다.

  • va_copy 은 현재 상태에서 인수 목록의 복사본을 만듭니다. 이 src 매개 변수는 va_start 으로 이미 반드시 초기화 해야합니다; va_arg 호출로 업데이트 되었으나 va_end 로 재설정 해야만하지 않습니다. 이 dest 에서 va_arg 로 검색된 다음 인수는 src 으로 부터 검색된 다음 인수와 같습니다.

  • 검색된 모든 인수 후에, va_endNULL 포인터로 재설정 합니다. va_endva_start 혹은 va_copy 인 초기화된 각 인수 목록으로 호출될 수 있습니다.

C++ 정보C++ 정보

VARARGS.H 인 매크로는 사용되지 않고 ANSI C89 표준 전에 쓰여진 코드와 호환성을 이전 버전만 유지합니다.다른 모든 경우에 매크로 STDARGS.H를 사용합니다.

/clr(공용 언어 런타임 컴파일) 사용하는 컴파일할 때, 이 매크로 사용하는 프로그램이 네이티브 및 공용 언어 런타임 (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( int가 아닌 unsigned int) 이고 NULL ( char*이 아닌 실제로 int) 입니다. 프로그램이 네이티브 코드를 컴파일할 때 이 출력을 만듭니다.

  
  

그러나 프로그램을 /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
/* Compile with: cl /W3 /Tc crt_va.c
 * The program below illustrates passing a variable
 * number of arguments using the following macros:
 *      va_start            va_arg              va_copy
 *      va_end              va_list
 */

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

double deviation(int first, ...);

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

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

    /* Call with just -1 terminator. */
    printf("Deviation is: %f\n", deviation(-1));
}

/* Returns the standard deviation of a variable list of integers. */
double deviation(int first, ...)
{
    int count = 0, i = first;
    double mean = 0.0, sum = 0.0;
    va_list marker;
    va_list copy;

    va_start(marker, first);     /* Initialize variable arguments. */
    va_copy(copy, marker);       /* Copy list for the second pass */
    while (i != -1)
    {
        sum += i;
        count++;
        i = va_arg(marker, int);
    }
    va_end(marker);              /* Reset variable argument list. */
    mean = sum ? (sum / count) : 0.0;

    i = first;                  /* reset to calculate deviation */
    sum = 0.0;
    while (i != -1)
    {
        sum += (i - mean)*(i - mean);
        i = va_arg(copy, int);
    }
    va_end(copy);               /* Reset copy of argument list. */
    return count ? sqrt(sum / count) : 0.0;
}

Output

  

해당 .NET Framework 항목

System::ParamArrayAttribute 클래스

참고 항목

참조

인수 액세스

vfprintf, _vfprintf_l, vfwprintf, _vfwprintf_l