Variadic arguments
가변 인수 함수는 서로 다른 개수의 인수로 호출될 수 있는 함수입니다.
오직 프로토타입된 함수 선언 만이 가변 인자를 가질 수 있습니다. 이것은 ... 형태의 매개변수로 표시되며, 매개변수 목록에서 반드시 마지막에 위치해야 합니다 그리고 최소 하나의 명명된 매개변수 뒤에 와야 합니다 (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
|