-
C언어 가변적인 함수 va_list, va_start(), va_arg(), va_end()Visual Studio/C 기초 2013. 8. 19. 16:53
여태 포스팅 했던 내용에서 printf()나 scanf()와 같이 가변적인 개수의 인수를 받아들이는 여러 가지 라이브러리 함수를 사용했는데요,
가변적인 개수의 인수를 받아들이는 자신만의 함수를 작성할 수도 있는데 이렇게 가변적인 개수의 인수를 받아들이는 함수를 사용하는 프로그램에는 헤더 파일 stdarg.h를 포함시켜야 합니다.
가변적인 개수의 인수를 받아들이는 함수를 선언할 때에는 우선 항상 사용되는 매개변수를 나열해야 하는데 최소한 고정된 매개변수가 있어야 합니다.
그리고 함수에 추가로 인수를 전달할 수 있다는 것을 표시하기 위해 매개변수의 목록에서 마지막 부분에 말줄임표를 포함시킵니다.
함수는 변수의 목록을 통해 각 인수의 형태를 알아야 합니다. printf()의 경우에는 변호나 문자가 각 인수의 형태를 알려줍니다.
가변적인 인수를 받아들이는 데 필요한 것들은 stdarg.h에 정의되어 있는데 아래와 같습니다.
va_list
포인터의 데이터형
va_start()
인수의 목록을 초기화하는 데 사용되는 매크로
va_arg()
변수 목록에서 차례대로 각각의 인수를 읽어들이는 데 사용되는 매크로
va_end()
모든 인수를 받아들이고 나서 정리 동작을 수행하는 데 사용되는 매크로
먼저 예제를 보겠습니다.
#include <stdio.h>
#include <stdarg.h>float avg(int num, ...);
main()
{
float x;x=avg(10,1,2,3,4,5,6,7,8,9,10);
printf("첫번째 평균 : %f\n\n",x);x=avg(5,121,206,76,31,5);
printf("두번째 평균 : %f\n", x);
}float avg(int num, ...)
{
va_list arg_ptr;
int count, total=0;va_start(arg_ptr, num);
for(count=0; count<num; count++)
total +=va_arg(arg_ptr,int);va_end(arg_ptr);
return((float)total/num);
}함수의 동작을 살펴볼게요.
float avg(int num, ...)
{
va_list arg_ptr; //포인터 arg_ptr을 va_list형으로 선언합니다.
int count, total=0;va_start(arg_ptr, num);//arg_ptr 포인터의 시작점을 num으로 설정하는데, 첫번째 평균을 구할 때 첫번째 인수가 10이었죠?
for(count=0; count<num; count++) //count의 값을 증가 시키면서
total +=va_arg(arg_ptr,int); //va_arg로 인수들을 int형으로 차례대로 읽어들이면서 total에 더합니다.va_end(arg_ptr); //정리 동작을 수행 합니다.
return((float)total/num); //평균을 구할 때 소숫점이 나올 수 있으므로 total을 float형으로 변환하고 total을 num으로 나눈값을
//반환합니다.
}
'Visual Studio > C 기초' 카테고리의 다른 글
C언어 시간 처리 함수 (0) 2013.09.01 C언어 strftime() 변환 문자 표 (0) 2013.09.01 C언어 void형 포인터 (0) 2013.08.17 C언어 참조에 의한 전달 (0) 2013.07.04 strlwr() strupr() (0) 2013.07.04