variadic_va_arg — va_arg 매크로

variadic_va_arg — va_arg 매크로

va_arg 매크로는 va_list에서 다음 가변 인자를 읽는 표현식이에요. <cstdarg> 헤더에 있어요.

T 타입으로 확장되는, 다음 매개변수에 해당하는 값을 반환해요.

출처: cppreference

본문

// <cstdarg> 헤더
T va_arg( std::va_list ap, T );

va_arg(ap, T)ap에서 다음 인자를 T 타입으로 읽어요.

사용 예

#include <cstdarg>
#include <cstdio>

double average(int count, ...) {
    va_list args;
    va_start(args, count);
    double sum = 0;
    for (int i = 0; i < count; ++i)
        sum += va_arg(args, double);   // 각 인자 읽기
    va_end(args);
    return sum / count;
}

average(3, 1.0, 2.0, 3.0);   // 2.0

규칙

  • va_arg 호출 전에 va_start(또는 va_copy)로 ap를 초기화해야 해요.
  • 읽는 타입 T는 실제로 전달된 인자 타입과 호환되어야 해요 (정수 승격·부동 소수점 승격 적용). 틀리면 정의되지 않은 동작이에요.
  • va_argva_end 호출 필요.

주의

  • 타입 안전하지 않아요 — 잘못된 타입으로 읽으면 정의되지 않은 동작.
  • 가변 함수는 C 호환(예: printf)에서 필요.
  • C++에서는 템플릿 가변 인자(팩)가 타입 안전한 대안.
// C++의 타입 안전한 대안
template<typename... Args>
double avg(Args... args) {
    return (static_cast<double>(args) + ...) / sizeof...(Args);
}

va_arg는 C 스타일 가변 인자 함수에서 인자를 읽는 핵심 매크로예요. 정확한 타입으로 읽어야 해요.

더 알아보기 (Learn more)

cppreference