서론
우리는 printf 함수 사용시 출력하고 싶은 내용이 하나씩 늘어날 때마다 인자를 하나씩 늘려나간다. 이처럼 인자의 개수를 마음대로 조절하여 사용할 수 있는 함수를 구현한다.
가변인자를 가지는 함수 구현
전체 코드
#include <stdio.h> #include <stdarg.h> void print(int num, ...) { va_list VA_LIST; va_start(VA_LIST, num); for(int i=0; i<num; i++) { int output = va_arg(VA_LIST, int); printf("%d ", output); } va_end(VA_LIST); } int main() { print(1, 10); // print : 10 printf("\n"); print(2, 10, 20); // print : 10 20 printf("\n"); print(3, 10, 20, 30); // print : 10 20 30 }
코드 해석
#include <stdarg.h>
가변인자를 사용하기 위해서는 stdarg.h가 필요하다. 이 헤더파일에는 va_start, va_end, va_arg, va_copy가 정의되어 있다. 이 중 va_start, va_end, va_arg를 사용한다.
void print(int num, ...) { }
가변인자를 가지는 함수를 만들기 위해서는 고정인자가 하나 이상 반드시 필요하고 고정인자들은 가변인자보다 앞에 와야 한다. 고정인자가 필요한 이유는 후술할 va_start의 인자로 사용하기 때문이고 가변인자는 “…”으로 표현한다.
va_list VA_LIST; va_start(VA_LIST, num);
va_list는 가변인자의 주소를 나타낼 포인터이다.
va_start(va_list, 고정인자)는 초기화 작업으로서 고정인자 바로 뒤에 가변인자들을 위치시키고 va_list에 첫 가변인자의 주소를 할당한다.
for(int i=0; i<num; i++) { int output = va_arg(VA_LIST, int); printf("%d ", output); }
va_arg(va_list, 자료형)는 va_start로 할당한 va_list의 값(가변인자 값)을 리턴한 후 va_list의 주소를 자료형만큼 뒤로 이동시킨다. 그렇게되면 다음 가변인자의 주소값이 va_list로 할당된다. 이를 가변인자 개수만큼 반복하면 모든 가변인자들을 출력할 수 있다.
va_end(VA_LIST);
va_list를 초기화한다.
사용처
서론에서의 예와 같이 사용자 정의 print문을 만들 때 종종 쓰인다. 그 외 쓰이는곳은 아직 보지 못했다.