Namespaces
Variants

va_start

From cppreference.net
헤더 파일에 정의됨 <stdarg.h>
void va_start ( va_list ap, parmN ) ;
(C23 이전)
void va_start ( va_list ap, ... ) ;
(C23 이후)

va_start 매크로는 명명된 인수 parmN 다음에 오는 (C23까지) 가변 인수들에 접근할 수 있도록 합니다.

va_start va_arg 에 대한 어떤 호출보다 먼저 유효한 va_list 객체 ap 의 인스턴스와 함께 호출되어야 합니다.

parmN register 스토리지 클래스 지정자, 배열 타입, 함수 타입, 또는 기본 인수 승격으로 결과되는 타입과 호환되지 않는 타입으로 선언된 경우, 동작은 정의되지 않습니다.

(C23까지)

va_start 에 전달되는 첫 번째 인수만 평가됩니다. 추가 인수들은 확장되지도 않고 어떤 방식으로도 사용되지 않습니다.

(C23부터)

목차

매개변수

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

확장된 값

(없음)

예제

#include <stdio.h>
#include <stdarg.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

참고문헌

  • 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.15.1.4 va_start 매크로 (p: 251-252)
  • C89/C90 표준 (ISO/IEC 9899:1990):
  • 4.8.1.1 The va_start 매크로

참고 항목

다음 가변 인수 함수 인자에 접근
(함수 매크로)
(C99)
가변 인수 함수 인자의 복사본 생성
(함수 매크로)
가변 인수 함수 인자의 순회 종료
(함수 매크로)
va_start , va_arg , va_end , va_copy 에 필요한 정보 보유
(typedef)
C++ documentation for va_start