C의 가변인자

IRC의 #ubuntu 에서 어제밤에 놀다보니 sakuragi 님께서 가변인자 포인터에 대해 공부하고 계신 다고 하더군요. 가변인자 포인터가 무슨 뜻일까하고 혹시 … <- 요거요? 하고 여쭤봤더니 그게 맞는 모양이더라구요. ㅎㅎ
뭐 제가 알고있던 몇가지를 정리하자면 가변인자 포인터는 매크로 함수라는 것. 함수 호출시 인자의 포인터를 가리키게 해서 인자들을 순서대로 읽어온다는 것 정도로 알 수 있습니다. 디버거등으로 함수 호출 시의 메모리 안을 들여다보시면 쉽게 이해하실 수 있을 거예요.
저도 디버깅 함수를 만들때라던가 할 때 유용하게 써먹곤 하는데요. 뭐 vsprintf 를 사용해서 디버깅 메시지를 원하는 데로 포멧팅해서 원하는 곳에 출력한다던가 하는 정도로 사용합니다.
C99 에서는 전처리기로 처리할 수 있도록 지원하기도 하는데(이게 정확한 표현이 아닐수도 있습니다; 뭐라고 써야할지 정확히 생각나진 않네요.) 제가 사용했던 ARM Development Suite 1.2 에 들어가 있는 ARMCC 에서 다음과 같이 작성해서 쓴 적이 있습니다. 코드 일부를 옮기자면..

// 디버그 함수
#ifndef        _DEBUG_
#define        DBG_OUT(…)    ;
#else
#define        DBG_OUT(…)    at91_usart_printf(&USART0_DESC, __VA_ARGS__)
#endif

이런 식으로 선언해서 써주었었죠. at91_usart_printf 함수는 제가 구현해서 썼던 함수인데 함수 내부에서 vsprintf 를 사용해서 가변인자 형식을 받아 printf처럼 포멧팅해서 내부시리얼로 전송하는 함수였습니다. 디버깅 메시지를 시리얼로 표시하고 싶을 땐 그냥 DBG_OUT(“값: %d\r\n”, value); 형식으로 써주면 됐었죠. 저는 매우 게으르므로 디버깅시마다 같은 글자를 매번 타이핑하기가 귀찮았거든요. 줄여쓰면 좋잖아요? ㅎㅎㅎ

처음 C 배울 때 printf 함수 정의의 … 으로 처리된 저건 어떻게 쓰는 걸까 하고 생각했던 기억이 떠오르기도 하네요. 궁금하신 분들은 서적이나 MSDN 등을 한번 뒤져보시는 것도 좋습니다.
제가 그렇게 배웠거든요 :D(하수의 이야기;)