본문 바로가기

C++

[C++] 가변 인수 함수

가변 인수 함수란 인수의 타입과 개수가 정해져 있지 않은 함수이다. 

대표적으로 printf가 있다.

printf("정수는 %d이고 실수는 %f이다.",i,d);

printf는 %d, %f같은 서식문자열이 늘어날 수록 인수도 늘어난다.

 

int GetSum(int num, ...)
{
     int sum=0;
     int i;
     va_list ap;
     int arg;

     va_start(ap,num);
     for (i=0;i<num;i++) {
          arg=va_arg(ap,int);
          sum+=arg;
     }

     va_end(ap);
     return sum;
}

void main()
{
     printf("1+2=%d\n",GetSum(2,1,2));
     printf("3+4+5+6=%d\n",GetSum(4,3,4,5,6));
     printf("10~15=%d\n",GetSum(6,10,11,12,13,14,15));
}

Getsum은 입력한 정수의 합을 모두 더해 출력하는 함수이다.

가변인수함수는 인수를 고정인수 한개와 ... 으로 나타낸다.

 

va_list ap

함수로 전달되는 인수는 스택에 저장되는데 현재 읽고 있는 번지를 기억하기 위해 va_list 형의 포인터 변수에 저장한다.

 

va_start(ap,마지막 고정 인수)

ap가 첫번째 가변인수를 가리키도록 초기화한다. 그 번지를 조사하기 위해 마지막 고정 인수를 전달 받는다.

 

va_arg(ap,인수타입)

가변인수를 실제로 읽는 명령이다.

 

va_end(ap)

가변 인수를 다 읽고 뒷정리를 하는데 없어도 상관없다.

 

 

가변인수함수의 조건은 다음과 같다.

①가변 인수 함수는 반드시 하나 이상의 고정 인수를 가져야 한다. va_start에서 초기화를 진행하기 위해서이다.

②함수 내부에서 자신에게 전달된 가변 인수의 개수를 알 수 있도록 해야 한다. 그래서 고정 인수를 통해 알려주거나 printf 같은 경우는 서식문자열의 개수로 가변 인수의 개수를 알 수 있다.

③함수 내부에서 가변인수 각각의 타입을 알아야 한다. printf 같은 경우는 서식문자열을 보고 인수의 타입을 알 수 있고 switch문 등을 이용해서 분기 별로 va_arg의 인수타입을 지정할 수 있다.

'C++' 카테고리의 다른 글

[C++] 인라인 함수  (0) 2022.01.03
[C++] 레퍼런스  (0) 2022.01.03
[C++] 함수 포인터  (0) 2022.01.03
[C++] Const 포인터  (0) 2022.01.03
[C++] 문자형 배열 vs 문자형 포인터  (0) 2022.01.02