Namespaces
Variants

va_start

cppreference.net에서
< c | 가변
헤더에 정의됨<stdarg.h>
void va_start( va_list ap, parmN );
(C23까지)
void va_start( va_list ap, ... );
(C23부터)

이 va_start 매크로는 변수 인수들명명된 인수 parmN(C23까지) 뒤에 오는 것들에 접근할 수 있게 합니다.

va_start 유효한 va_list 객체의 인스턴스와 함께 호출되어야 하며ap va_arg에 대한 호출 전에 이루어져야 합니다.

만약 parmN이 register 저장 클래스 지정자, 배열 타입, 함수 타입, 또는 기본 인수 승격으로 인해 발생하는 타입과 호환되지 않는 타입으로 선언된 경우, 동작은 정의되지 않습니다.

(C23까지)

만약 va_start에 둘 이상의 인수가 존재하는 경우, 두 번째 및 그 이후의 인수로 구성된 전처리 토큰은 폐기됩니다. 해당 인수 중 하나라도 균형이 맞지 않는 괄호를 포함하거나, 토큰으로 변환되지 않는 전처리 토큰으로 확장되는 경우, 동작은 정의되지 않습니다.

(C23부터)

매개변수

ap - va_list 타입의 인스턴스
parmN - 첫 번째 가변 매개변수 앞에 오는 명명된 매개변수

전개 값

(없음)

예제

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

int add_nums_C99(int count, ...)
{
    int result = 0;
    va_list args;
    va_start(args, count); // count can be omitted since C23
    
    for (int i = 0; i < count; ++i)
        result += va_arg(args, int);
    
    va_end(args);
    return result;
}

#if __STDC_VERSION__ > 201710L
// Same as above, valid since C23
int add_nums_C23(...)
{
    int result = 0;
    va_list args;
    va_start(args);
    
    int count = va_arg(args, int);
    for (int i = 0; i < count; ++i)
        result += va_arg(args, int);
    
    va_end(args);
    return result;
}
#endif

int main(void)
{
    printf("%d\n", add_nums_C99(4, 25, 25, 50, 50));
#if __STDC_VERSION__ > 201710L
    printf("%d\n", add_nums_C23(4, 25, 25, 50, 50));
#endif
}

가능한 출력:

150
150

참조

  • C23 표준 (ISO/IEC 9899:2024):
  • 7.16.1.4 va_start 매크로 (p: 290-292)
  • C17 표준 (ISO/IEC 9899:2018):
  • 7.16.1.4 va_start 매크로 (p: 198-199)
  • C11 표준 (ISO/IEC 9899:2011):
  • 7.16.1.4 va_start 매크로 (p: 271-272)
  • C99 표준 (ISO/IEC 9899:1999):
  • 7.16.1.4 va_start 매크로 (p: 251-252)
  • C89/C90 표준 (ISO/IEC 9899:1990):
  • 4.8.1.1 va_start 매크로

같이 보기

다음 가변 인수 함수 인수에 접근
(함수 매크로)
가변 인수 함수 인수의 복사본을 만듦
(함수 매크로)
가변 인수 함수 인수 순회를 종료
(함수 매크로)
va_start, va_arg, va_end, 및 va_copy
에 필요한 정보를 보유(typedef)
C++ 문서 for va_start