C언어 가변인자 (va_list)

junpkim·2022년 5월 17일
0

ft_printf 의 mandatory 구현 핵심은 가변 인자 사용이다.

먼저 printf의 함수 원형부터 보면

int printf(const char* format, ...)

위와 같이 되어있는데, 두 번째 인자로 사용 되는 ... 이 가변인자 라고 불리는 것이다. 이 덕분에 첫 번째 인자 이후에 아무것도 넘겨주지 않을 수도 있고, 여러 개의 인자를 넘겨줄 수도 있는 것이다.

먼저 가변 인자를 사용하기 위해선 stdarg.h 헤더 파일을 include 해야 한다. 이 헤더 파일에는 가변인자 사용에 필요한 각종 매크로들이 정의되어 있다.

해당 헤더 파일에 정의 되어있는 매크로들을 살펴 보면,

va_list

가변인자를 가리킬 포인터이다. 선언시 변수명으로 사용하면 된다.

va_start

#define va_start(ap, v) ( (ap) = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v) )

va_list로 만들어진 포인터에게 가변인자의 첫 번째 주소를 가르쳐주는 매크로이다.

ap: va_list로 선언된 포인터

v: 마지막 고정인수

va_list로 선언된 포인터에 (마지막 고정인수의 주소 값 + 마지막 고정인수의 크기) 로 첫 번째 가변인자의 주소값을 구해서 넣어준다.

va_arg

#define va_arg(ap, t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )

va_list 의 포인터를 다음 가변인자의 주소값으로 넘겨주는 매크로이다.

마찬가지로 현재 참조하고 있는 인자의 크기를 더해주는 식으로 다음 가변인자의 주소값을 구한다.

va_end

#define va_end(ap)  (ap = (va_list)0)

가변인자 사용을 종료한다.

0개의 댓글