C 언어에서 가변 인수의 사용...
글쓴이: 익명 사용자 / 작성시간: 수, 2002/03/06 - 4:18오후
안녕하십니까. 학생입니다.
C 언어 예제를 실행시키다가 가변 인수를 사용하는 예에서 막혔습니다.
이 책이 예전 도스의 Turbo-C 2.0 을 기준으로 작성되어있어서인지는
모르겠습니다만, 제가 사용하는 유닉스 계정에서는 컴파일이 안됩니다.
#include
void sample( char *, ... );
int main( void )
{
sample("%d ", 1, 2, 3, 4, 5, 6, 7, 8, 0 );
return( 0 );
}
void sample( char *format, ... )
{
void *p;
int value;
p = ...; // 이 부분에서 에러가 걸립니다.
do {
value = *(int *)p;
printf( format, value );
((int *)(p))++;
} while( value != 0 );
}
책에 있는 설명만으로는 무슨 말인지 잘 모르겠더군요.
일단 2가지가 궁금합니다.
첫째로 가변 인수를 사용하기 위해서는 함수 정의와 선언에서 어떤
절차로 기술해주어야 하는 것인가. 의 문제와...
둘째 가변 인수를 사용하는 함수에서 인수의 개수와 그 위치를 아는 방법.
이상의 2가지 입니다.
아시는 분께서 답변을 주시면 감사하겠습니다.
Forums:
Re: C 언어에서 가변 인수의 사용...
/* 간단한 예제입니다. */
#include
#include
int
add_em_up (int count,...)
{
va_list ap;
int i, sum;
/* 인수 목록을 초기화하라. */
va_start (ap, count);
sum = 0;
for (i = 0; i < count; i++)
/* 다음 인수값을 얻어라. */
sum += va_arg (ap, int);
/* 정리하라. */
va_end (ap);
return sum;
}
int
main (void)
{
/* 이 호출은 16을 출력한다. */
printf ("%d\n", add_em_up (3, 5, 5, 6));
/* 이 호출은 55를 출력한다. */
printf ("%d\n", add_em_up (10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
return 0;
}
출처는 Glibc 번역본 입니다.
이곳 KLDP 에도 있는 문서죠....
도움이 되셨기를......
Re: C 언어에서 가변 인수의 사용...
도움이 될까해서 몇자 적습니다.
가변인수를 사용하시려면 va_list,va_start,va_arg,va_end를 사용하시면 됩니다.
위는 macro로서 정의 되어있는 것으로 기억됩니다.
가변인수를 인자로 받을 때는 그 사이즈가 정의 되어있지 않으므로,va_arg에서 인수를 fetch할때
그 사이즈를 인수로 넘겨줘야합니다. 즉 va_arg(ap,int) ,va_arg(ap,char*) 등으로 말입니다.
그리고 가변인수의 갯수는 정의되어있지 않으므로, 함수를 만들때 어떻게 인수의 갯수를 알려주는지 결정해야 합니다.
예로서 printf("%d%s",...)에서 printf함수는 %의 갯수로 인수의 갯수를 알아냅니다.
그래서 ,
printf(.fmt,..)
{
while(*fmt!=0)
{
if(*fmt++=='%')
{
if(*fmt=='d')
va_arg(ap,int);
...
}
}
이런식으로 작동되는것으로 기억됩니다. (지금 책을 놓고 쓰는것이 아니라서 죄송)
또다른 방법은 인자의 마지막인수로 특정값(대부분 0)을 넘겨주어 이를 인수의 끝으로 인식하는
방법입니다.
도움이 되셨스면 합니다.
댓글 달기