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_arg후va_end호출 필요.
주의
- 타입 안전하지 않아요 — 잘못된 타입으로 읽으면 정의되지 않은 동작.
- 가변 함수는 C 호환(예:
printf)에서 필요. - C++에서는 템플릿 가변 인자(팩)가 타입 안전한 대안.
// C++의 타입 안전한 대안
template<typename... Args>
double avg(Args... args) {
return (static_cast<double>(args) + ...) / sizeof...(Args);
}
va_arg는 C 스타일 가변 인자 함수에서 인자를 읽는 핵심 매크로예요. 정확한 타입으로 읽어야 해요.