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)되어 전달돼요 (예: floatdouble).
  • C++에서는 템플릿 가변 인자(parameter pack)가 타입 안전한 대안이에요.
// 타입 안전한 C++ 대안
template<typename... Args>
int sum_all(Args... args) {
    return (args + ...);   // C++17 폴드 표현식
}

가변 인자 함수는 주로 C 호환(printf 계열)을 위해 여전히 필요하지만, 새 C++ 코드에서는 가변 인자 템플릿을 우선 사용해요.

더 알아보기 (Learn more)

cppreference