printf("%d, %s, %c", 1, str, 'c');
함수 인자의 갯수를 변경해도 문제없이 작동하는 printf함수는 어떤 인자를 갖고있을까?
int printf(const char* formt, ...)
printf함수의 두번째 인자로 사용되는 ... 이 가변 인자 혹은 가변 파라미터 이다.
가변인자의 함수를 만들기 위해서는 stdarg.h 헤더파일을 포함해야한다. 이 헤더파일에는 가변인자 함수를 만들때 필요한 매크로 들이 정의되어잇다.
가변인자 함수를 만들때에는 최소 1개 이상의 고정인수가있어야 한다. 가변인자 ...은 파라미터 순서상 가장 뒤에 있어야 한다.
#include <stdio.h>
#include <stdarg.h>
int sum(int count, ...)
{
int res = 0;
va_list ap;
int i;
va_start(ap, count);
for(i=0; i<count; i++)
res += va_arg(ap, int);
va_end(ap);
return res;
}
int main()
{
printf("%d\n", sum(10, 1,2,3,4,5,6,7,8,9,10));
return 0;
}
[출력 결과]
55
가변 인자를 이용해서 모든 파라미터를 더해주는 sum() 함수이다.
va_list: 각 가변인자의 시작 주소를 가리킬 포인터, char*로 정의되어있다.
va_start: va_list 로 만들어진 포인터에게 가변인자 중 첫번째 인자의 주소를 가르쳐주는 중요한 매크로이다.
#define va_start(ap,v) ( (ap) = (va_list)_ADRESSOF(v) + _INTSIZEOF(v) )
va_arg: 특정 가변인자를 가리키고있는 va_list포인터를 다음 가변인자로 이동 시켜주는 매크로
va_end : 사용한 가변인자 변수를 끝낼때 사용한다 NULL포인터로 돌려주는 매크로이다.