개발자 노트

가변인자 함수 본문

▶ INBOX ◀

가변인자 함수

heeyam 2016. 9. 20. 11:16
반응형

printf 함수와 scanf 함수의 공통점

: 첫 번째 전달인자인 문자열에 존재하는 서식문자의 수만큼 전달인자의 수도 증가한다.

   서식문자: 출력양식의 형태를 지정할 때 사용하는 문자 ex) %d, %c, %s 등

위의 함수들이 정의되어 있는 stdio.h 헤더파일을 살펴보면 다음과 같다.

함수의 매개변수 선언을 보면 … 있다. 이 것은 인자의 자료형과 수에 제한이 없음을 의미한다.

  • 가변인자 매개변수의 선언방법

    매개변수 선언을 통해서 미리 함수가 호출 될 때 전달되어야 할 인자의 수와 자료형이 결정된다. 그런데

    가변인자 함수는 호출이 될 때 인자의 수가 결정되기 때문에 … 으로 가변인자에 대한 선언을 한다.

소스코드

#include <stdio.h>

int Sum(int n, ...);

int main(void)

{

Sum(2, 1, 2); // 2개를 더하겠다. 1+2

Sum(3, 1, 2, 3); // 3개를 더하겠다. 1+2+3

Sum(4, 1, 2, 3, 4); // 4개를 더하겠다. 1+2+3+4

return 0;

}

int Sum(int n, ...)

{

printf("num=%d \n", n);

return 0;

}

실행결과

위 예제를 통해 가변인자에 대한 매개변수의 선언방식을 알 수 있다.

Sum 수의 첫 번째 인자는 더해질 값의 개수이고, 나머지 인자는 더해질 값들이다.

 

  • 전달된 인자들 추출 방법

    가변인자 함수의 호출을 통해서 전달되는 인자정보를 추출하기 위해서는 다음 단계를 거쳐야 한다.

    괄호 안은 각각의 기능을 제공하는 함수의 이름과 참조자의 자료형이다.

    이들을 사용하기 위해서는 헤더파일 stdarg.h 를 포함해야 한다.

  1. 가변인자를 가리킬 수 있는 참조자를 선언한다. (va_list)
  2. 참조자가 가변인자를 실제로 참조할 수 있도록 한다. (va_start)
  3. 참조자를 통해 전달된 정보를 추출한다. (va_arg)
  4. 참조자가 더 이상 가변인자를 가리키지 않도록 해제한다. (va_end)

소스코드

#include <stdio.h>

#include <stdarg.h>

int Sum(int n, ...);

int main(void)

{

printf("1+2=%d \n", Sum(2, 1, 2));

printf("1+2+3=%d \n", Sum(3, 1, 2, 3));

printf("1+2+3+4=%d \n", Sum(4, 1, 2, 3, 4));

return 0;

}

int Sum(int n, ...)

{

int sum=0;

int i;

va_list vlist; // 단계1: 가변인자의 참조자 선언

 

va_start(vlist, n); // 단계2: 참조 대상과 범위 지정

for(i=0; i<n; i++)

sum+=va_arg(vlist, int); // 단계3: 값 추출

 

va_end(vlist); // 단계4: 해제

return sum;

}

실행결과

# 참조
열혈C프로그래밍;윤성우

반응형
Comments