출처 : http://blog.paran.com/mk3358/12232583 (원 출처가 폐쇄되어 링크를 대신합니다.)

 

어떤 함수의 경우에는 인자의 타입 검사를 생략하는 경우가 있다.

C의 printf()와 같이 함수의 인자 개수가 일정하지 않은 가변 인자 함수가 그렇다.

이 함수의 원형은 아래와 같다.


int printf( const char *format, ... );


이 함수의 마지막 인자처럼 생략부호(...)로 적어주면

가변 인자 함수(variadic function)를 나타낸다(생략부호 앞의 콤마는 생략해도 된다).

가변 인자 함수는 인자가 정확히 몇 개 오는지 또 어떤 타입인지 알 수 없기 때문에 타입 검사를 할 수 없다.

그래서 printf() 함수 사용은 전적으로 사용자 책임이다.

다음 예와 같이 엉뚱한 사용으로 돌아오는 결과는 실행 시간에 치명적인 에러로 나타난다.


int a = 10 ;
printf( '%d, %f, %dd, %s', a ) ;


참고적으로 가변 인자 함수를 정의하는 절차에 대해 소개한다.


① 우선 stdarg.h 헤더 파일을 포함한다.


#include <stdarg.h>

 

② 가변 인자 함수의 원형을 정한다.

가변 인자 함수에서 마지막 인자는 생략부호, 첫번째 인자는 보통의 인자로 선언해야 한다.

예로 임의 개수의 실수 합을 구하는 함수 sum()을 정의해 보자. 첫 인자는 가변 인자의 수를 넘긴다.

double sum( int n... ) ; 또는 double sum( int n, ... ) ;



③ 함수 정의 안에서 va_list 타입의 변수를 선언한다. 예를 들어 list라 하자.


va_list list ;

 list는 함수의 실인자열을 가리키는 포인터 역할을 한다.



④ va_start 매크로를 사용하여 인자열의 첫 인자를 포인터에 설정한다. va_start매크로의 첫 인자에 va_list 타입으로 선언한 변수를 넣고, 두 번째 인자는 지금 정의하는 함수의 첫 인자를 넣는다.


va_start(list,n);

 

⑤ va_arg 매크로를 사용하여 리스트에서 인자를 꺼내 쓴다. va_arg 매크로의 첫 인자는 va_list 타입으로 선언한 변수이고, 두 번째 인자는 가변 인자열의 인자 타입이다. 실수에 대한 합을 구하므로 double형을 주자.


double item = va_arg(list, double);

 

⑥ va_end 매크로를 사용하여 가변 인자열 포인터를 리셋(reset) 시킨다.


va_end(list);


 

'Programming Languages > C' 카테고리의 다른 글

가변 인자 함수 2  (0) 2010.08.31
포인터 다루기  (0) 2010.04.08
파일 입/출력  (0) 2010.03.14
재귀 함수  (0) 2010.03.09
fflush.c  (0) 2010.01.12
Posted by 독뽀
,