C언어 함수 가변인자 함수

    2018-02-05 01:40:23 작성

    printf와 scanf 함수를 보면 첫번째 전달되는 인자의 양식기호에 따라 두번째 부터는 그 인자수가 달라지게 됩니다.
    다음과 같은 함수가 있다고 가정하겠습니다.

    total = sum(3, 8); // 3+8
    total = sum(2, 4, 6); // 2+4+6
    total = sum(1, 7, 20, 12); // 1+7+20+12

    이렇게 sum 함수와 같은 형태의 호출이 가능한 함수를 가변인자 함수라고 합니다.

    가변인자 함수의 선언방법

    #include <stdio.h>
    
    int sum(int n, ...);
    
    int main(void) {
        sum(2, 3, 8);
        sum(3, 2, 4, 6);
        sum(4, 1, 7, 20, 12);
        return 0;
    }
    
    int sum(int n, ...) { // ...은 가변인자 선언
        printf("n = %d\n", n);
    }


    위와 같이 매개변수에 ...은 인자의 개수를 가변적으로 받겠다는 의미입니다.
    가변인자 선언은 자료형과 수에 제한이 없음을 의미합니다.
    따라서 main함수에서 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("3 + 8 = %d\n",sum(2, 3, 8));
        printf("2 + 4 + 6 = %d\n", sum(3, 2, 4, 6));
        printf("1 + 7 + 20 + 12 = %d\n", sum(4, 1, 7, 20, 12));
        return 0;
    }
    int sum(int n, ...) {
        int sum = 0;
        int i;
        va_list vlist; // 1. va_list 참조자 변수 vlist 선언
        va_start(vlist, n); // 2. va_start 함수로 vlist의 참조대상과 범위 지정
        for (i = 0; i < n; i++) {
            sum += va_arg(vlist, int); // 3. vlist 에서 int 자료형으로 값 추출
        }
        va_end(vlist); // 4. vlist 변수 해제
        return sum;
    }