Programming

[C] Variable argument의 사용 예

[ CnUnix ] in KIDS
글 쓴 이(By): outsider (하얀까마귀)
날 짜 (Date): 2001년 1월 9일 화요일 오후 10시 41분 52초
제 목(Title): 인수 여러개…

printf처럼 함수의 인수의 갯수를 임의로 할 수 있는 함수를 만들고 싶다면 어떻게 해야 하나요?
인수의 타입은 뭐 반복 부분에서는 한가지라고 해두지요.

[ CnUnix ] in KIDS
글 쓴 이(By): testors (테스토스)
날 짜 (Date): 2001년 1월 9일 화요일 오후 11시 23분 00초
제 목(Title): Re: 인수 여러개…

첫 인자는 꼭 있어야 합니다. 아래는 printf를 구현한 예제 입니다.. 자세한건 va 시리즈 함수군들 man 때려보시면 나옵니다.

#include

void function(int a, ...) {
va_list argptr;
char str[1024];
va_start (argptr, fmt);
vsprintf (str, fmt, argptr);
write (1, str, strlen (str));
va_end (argptr);
}

– Testors

[ CnUnix ] in KIDS
글 쓴 이(By): terzeron (the cowboy)
날 짜 (Date): 2001년 1월 10일 수요일 오후 12시 58분 43초
제 목(Title): Re: 인수 여러개…

시스템마다 조금씩 다른 것 같은데, testors님께서 말씀하신대로 va_*함수들을 사용하셔야 합니다.

구체적인 선언과 사용에 있어서 시스템을 좀 타는 것 같더군요. 일례로, elm(요즘은 잘 안 쓰지만)을 컴파일하다보면 그게 자꾸 말썽을 일으키더라구요.

매뉴얼도 각각 다르게 나오죠. man va_start와 man stdarg는 variable argument를 다른 방식으로 선언한다는 것을 보여줍니다. 실제 코드(from elm/src/curses.c)를 참조해보면 다음과 같습니다.

#ifdef I_STDARG
# include 
#else
# include 
#endif

...

#ifdef I_STDARG
Write_to_screen(char *line, int argcount, ...)
{
char *arg1, *arg2, *arg3;
va_list vl;
va_start(vl, argcount);
#else
Write_to_screen(line, argcount, va_alist)
char *line;
int argcount;
va_dcl
{
char *arg1, *arg2, *arg3;
va_list vl;
va_start(vl);
#endif

도움이 되었으면 좋겠네요.

답글 남기기