ft_printf 의 mandatory 구현 핵심은 가변 인자 사용이다.
먼저 printf의 함수 원형부터 보면
int printf(const char* format, ...)
위와 같이 되어있는데, 두 번째 인자로 사용 되는 ... 이 가변인자 라고 불리는 것이다. 이 덕분에 첫 번째 인자 이후에 아무것도 넘겨주지 않을 수도 있고, 여러 개의 인자를 넘겨줄 수도 있는 것이다.
먼저 가변 인자를 사용하기 위해선 stdarg.h 헤더 파일을 include 해야 한다. 이 헤더 파일에는 가변인자 사용에 필요한 각종 매크로들이 정의되어 있다.
해당 헤더 파일에 정의 되어있는 매크로들을 살펴 보면,
가변인자를 가리킬 포인터이다. 선언시 변수명으로 사용하면 된다.
#define va_start(ap, v) ( (ap) = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v) )
va_list로 만들어진 포인터에게 가변인자의 첫 번째 주소를 가르쳐주는 매크로이다.
ap: va_list로 선언된 포인터
v: 마지막 고정인수
va_list로 선언된 포인터에 (마지막 고정인수의 주소 값 + 마지막 고정인수의 크기) 로 첫 번째 가변인자의 주소값을 구해서 넣어준다.
#define va_arg(ap, t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
va_list 의 포인터를 다음 가변인자의 주소값으로 넘겨주는 매크로이다.
마찬가지로 현재 참조하고 있는 인자의 크기를 더해주는 식으로 다음 가변인자의 주소값을 구한다.
#define va_end(ap) (ap = (va_list)0)
가변인자 사용을 종료한다.