va_list 에 관해서...
글쓴이: leolo / 작성시간: 화, 2004/01/06 - 11:35오후
대부분 stdarg.h 를 이용하던데, 저는 varargs.h 를 이용하려고 합니다.
그런데, stdarg.h를 사용하는 것과 varargs.h 사용하는데 사용하는
매크로의 형식이 다른가요?
예를 들어 va_start()의 인자 수가 다르거나...
variable argument 함수를 이용해서 문자열을 뽑아내고 있는데,
va_arg() 에서 마지막임을 알아내는 방법을 모르겠습니다.
------------------------------------------------------------------
void test1(va_alist)
va_dcl
{
va_list vaArgs;
char *args[100];
int nArgs = 0;
va_start(vaArgs);
while ( (args[nArgs++] = va_arg(vaArgs, char *)) != NULL ) <----- 이 부분 !
{
......
}
va_end(vaArgs);
......
}
------------------------------------------------------------------
va_arg() 의 결과에서 어떻게 확인해야 마지막인지 알 수 있을까요?
stdarg.h 에서는 호환성 있는 방법이 없는 것으로 알고 있는데.
한가지 방법으로 인자의 갯수를 가변인자로 전달하는 방법이 있는 것으로
알고 있는데 다른 방법은 없는지요..
Forums:
왜 굳이 varargs.h 를 사용하려 하시는지요... 표준에서 stda
왜 굳이 varargs.h 를 사용하려 하시는지요... 표준에서 stdargs.h를 쓰기로 결정한지도 벌써 14년이 지났습니다. 이제 표준에서 varargs란 단어는 단 한번도 나오질 않습니다. 또한 varargs.h나 stdargs.h나 성능이나 편리함 같은 면에서는 전혀 차이가 없습니다.
그리고 올리신 소스 코드는 ANSI C 이전의 비원형 선언방식을 사용하셨는데 이 또한 좋지 않은 방식입니다.
어쨌거나, 가변 인자 함수 내부에서 넘겨받은 매개변수의 수나 타입을 알아낼 수 있는 방법은 전혀 없습니다. 따라서 다른 방법으로 매개변수의 수와 타입을 넘겨주어야 합니다. printf 함수나 scanf 함수의 경우에는 형식 문자열이 바로 그와 같은 역할을 하고 있습니다. 만약 넘겨 받는 가변 인자들이 모두 같은 타입을 가지는 것이 확실하다면, 가변 인자의 갯수만 따로 넘겨 주던가 아니면 가장 마지막 가변 인자를 0(또는 다른 값과 구별되는 특별한 값)으로 주는 방법을 쓸 수도 있습니다.
위에 올리신 소스 코드는 아마도 가장 마지막 매개변수로 널 포인터를 주는 그런 가변인자 함수 같습니다. 사용하기 위해서는 아마도 다음과 같이 하면 되겠지요.
댓글 달기