Namespaces
Variants

Variadic arguments

From cppreference.net

가변 인수 함수는 서로 다른 개수의 인수로 호출될 수 있는 함수입니다.

오직 프로토타입된 함수 선언 만이 가변 인자를 가질 수 있습니다. 이것은 ... 형태의 매개변수로 표시되며, 매개변수 목록에서 반드시 마지막에 위치해야 합니다 그리고 최소 하나의 명명된 매개변수 뒤에 와야 합니다 (C23 이전) . 생략 부호 매개변수와 앞선 매개변수는 , 로 구분되어야 합니다.

// 프로토타입 선언
int printx(const char* fmt, ...); // 이렇게 선언된 함수
printx("hello world");     // 하나의 인수로 호출 가능
printx("a=%d b=%d", a, b); // 또는 여러 개의 인수로 호출 가능
int printz(...); // C23부터 및 C++에서 허용
// C23까지 오류: ...은 적어도 하나의 명명된 매개변수를 따라야 함
// int printy(..., const char* fmt); // 오류: ...은 마지막이어야 함
// int printa(const char* fmt...);   // C에서 오류: ','가 필요함; C++에서는 허용

함수 호출 에서, 가변 인수 목록의 일부인 각 인수는 기본 인수 승격 으로 알려진 특별한 암시적 변환을 겪습니다.

가변 인자를 사용하는 함수 본문 내에서, 이러한 인자들의 값은 <stdarg.h> 라이브러리 기능 을 사용하여 접근할 수 있습니다:

헤더 파일에 정의됨 <stdarg.h>
가변 인수 함수 인자에 대한 접근을 활성화
(함수 매크로)
다음 가변 인수 함수 인자에 접근
(함수 매크로)
(C99)
가변 인수 함수 인자의 복사본 생성
(함수 매크로)
가변 인수 함수 인자 순회 종료
(함수 매크로)
va_start , va_arg , va_end , va_copy 에 필요한 정보 보유
(typedef)

목차

참고 사항

구식(프로토타입 없는) 함수 선언 은 이후 함수 호출에서 임의의 개수의 인수를 사용할 수 있게 허용하지만, (C89 기준으로) 가변 인수를 허용하지 않습니다. 이러한 함수의 정의는 고정된 개수의 매개변수를 지정해야 하며 stdarg.h 매크로를 사용할 수 없습니다.

// 구식 선언 방식, C23에서 제거됨
int printx(); // 이 방식으로 선언된 함수
printx("hello world");     // 하나의 인수로 호출될 수 있음
printx("a=%d b=%d", a, b); // 또는 더 많은 인수로 호출될 수 있음
// 함수가 정의된 매개변수 개수에 따라 최소한 이 호출들 중 하나의 동작은 정의되지 않음

예제

#include <stdio.h>
#include <time.h>
#include <stdarg.h>
void tlog(const char* fmt,...)
{
    char msg[50];
    strftime(msg, sizeof msg, "%T", localtime(&(time_t){time(NULL)}));
    printf("[%s] ", msg);
    va_list args;
    va_start(args, fmt);
    vprintf(fmt, args);
    va_end(args);
}
int main(void)
{
   tlog("logging %d %d %d...\n", 1, 2, 3);
}

출력:

[10:21:38] logging 1 2 3...

참고문헌

  • C17 표준 (ISO/IEC 9899:2018):
  • 6.7.6.3/9 함수 선언자 (프로토타입 포함) (p: 96)
  • 7.16 가변 인자 <stdarg.h> (p: 197-199)
  • C11 표준 (ISO/IEC 9899:2011):
  • 6.7.6.3/9 함수 선언자 (프로토타입 포함) (p: 133)
  • 7.16 가변 인자 <stdarg.h> (p: 269-272)
  • C99 표준 (ISO/IEC 9899:1999):
  • 6.7.5.3/9 함수 선언자 (프로토타입 포함) (p: 119)
  • 7.15 가변 인자 <stdarg.h> (p: 249-252)
  • C89/C90 표준 (ISO/IEC 9899:1990):
  • 3.5.4.3/5 함수 선언자 (프로토타입 포함)
  • 4.8 가변 인자 <stdarg.h>

참고 항목

C++ 문서 에 대한 Variadic arguments