반응형

출처 : 네이버지식인
http://kin.naver.com/detail/detail.php?d1id=1&dir_id=10104&docid=1611565

printf함수의 경우 원형을 보면 앞에 char *format이 있고 그 뒤에 [, argument... ]라고되어 있습니다.
헤더를 가봐도 함수의 선언 정도 밖에는 없더군요.
제가 궁금한건 함수 호출시 printf의 경우 앞의 format 부분만 넘겨줘도 문제 없이 잘 호출됩니다.
printf("printf testing"); 이렇게요.
그런데 뒤에 앞의 포멧에 출력지정이 되 있으면 인자를 넘겨줘야 하지요?
printf("printf testing : %d %x %c", 10, 255, 'c');
C++에서는 함수 오버로딩을 이용해 구현할 수 있다고 생각은 합니다만
예전 C에선 저런 경우 어떻게 함수를 구현했는지 궁금합니다.
그냥 함수를 int print(char *fmt, int ar1, int ar2, int ar3, int ar4, int ar5); 같이 선언하면
앞의 char * 인자로 문자열을 넘겨주기만 하려 하면
당연히 뒤의 int 인자가 없어서 맞는 함수가 없다고 나오더군요...
다중정의를 하지 않고 한 함수에서 이걸 다 처리하게 하려면 어떻게 해야하는건지...
뭔가 특별한 옵션을 주거나 하는건지 궁금합니다.
(만약, 다중정의로 하려면 인자가 1개 들어올때부터 5개 들어올때까지 다 함수를 따로 만들어줘야 할것 같은데... 맞는지요?)





C++에서의 오버로딩이 아닙니다.
함수 인자를 가변적으로 만들 때 사용하는 ...(점 세개)를 통해 가능한 것입니다.
printf()의 실제 함수 선언은
int __cdecl printf (const char *format,  ... );
이것입니다.
보시면, 첫번째 인자는 const char *형으로 지정되어 있고,
그 뒤에는 점이 세개 연이어 나옵니다.
가변 인자라는 얘기죠.
함수의 인자를 이렇게 가변 인자로 만들게 되면,
저 가변 인자에는 어떠한 타입, 몇개의 인자라도 받을 수 있게 됩니다.
다만, 함수 안에서 그 인자들의 갯수나 값을 얻기 위해서는,

va_list arglist;
va_start(arglist, format);

위와 같이 리스트를 얻고

va_arg(arglist, int);

이런식으로 값을 하나씩 받아와야 합니다.
그리고

va_end(arglist);

이렇게 종료까지 시켜줘야 하죠.
유용하면서도 조금은 까다로운 사용방법을 갖고 있습니다.

반응형

'C & C++ 관련' 카테고리의 다른 글

gotoxy  (0) 2008.06.22
신기한 C 프로그래밍~  (2) 2008.04.30
NULL과 \0의 관계  (3) 2008.04.17
Posted by Real_G