variadic — 가변 인자 함수
variadic — 가변 인자 함수 (Variadic functions)
**가변 인자 함수(variadic function)**는 가변 개수의 인자를 받는 함수예요 (예: std::printf). <cstdarg> 헤더가 이를 지원해요.
가변 인자 함수를 선언하려면 매개변수 목록 뒤에 **줄임표(ellipsis)**를 둬요.
출처: cppreference
본문
선언
#include <cstdarg>
void my_func(int fixed, ...); // 고정 인자 + 가변 인자
<cstdarg> 매크로
| 매크로 | 설명 |
|---|---|
va_start(ap, last) |
가변 인자 접근 시작 |
va_arg(ap, T) |
다음 인자 읽기 |
va_copy(ap_dst, ap_src) |
va_list 복사 |
va_end(ap) |
정리 |
사용 예
#include <cstdarg>
#include <cstdio>
int sum(int count, ...) {
va_list args;
va_start(args, count);
int total = 0;
for (int i = 0; i < count; ++i)
total += va_arg(args, int);
va_end(args);
return total;
}
sum(3, 10, 20, 30); // 60
여러 종류
가변 인자 함수에서 인자의 타입과 개수는 함수 자체(또는 그 계약)가 알아야 해요. 값의 개수를 고정 인자로 넘기거나(count), 종결자(예: nul 포인터)를 쓰는 방식이 일반적이에요.
주의
- 타입 안전하지 않아요 — 잘못된 타입으로
va_arg를 쓰면 정의되지 않은 동작. - 정수·부동 소수점은 승격(promotion)되어 전달돼요 (예:
float→double). - C++에서는 템플릿 가변 인자(parameter pack)가 타입 안전한 대안이에요.
// 타입 안전한 C++ 대안
template<typename... Args>
int sum_all(Args... args) {
return (args + ...); // C++17 폴드 표현식
}
가변 인자 함수는 주로 C 호환(printf 계열)을 위해 여전히 필요하지만, 새 C++ 코드에서는 가변 인자 템플릿을 우선 사용해요.