[C, C++] 가변인자를 가지는 함수 구현

서론

우리는 printf 함수 사용시 출력하고 싶은 내용이 하나씩 늘어날 때마다 인자를 하나씩 늘려나간다. 이처럼 인자의 개수를 마음대로 조절하여 사용할 수 있는 함수를 구현한다.

가변인자를 가지는 함수 구현

전체 코드

#include <stdio.h>
#include <stdarg.h>

void print(int num, ...)
{
    va_list VA_LIST;
    va_start(VA_LIST, num);

    for(int i=0; i<num; i++)
    {
        int output = va_arg(VA_LIST, int);
        printf("%d ", output);
    }

    va_end(VA_LIST);
}

int main()
{
    print(1, 10); // print : 10
    printf("\n");
    print(2, 10, 20); // print : 10 20
    printf("\n");
    print(3, 10, 20, 30); // print : 10 20 30 
}

코드 해석

#include <stdarg.h>

가변인자를 사용하기 위해서는 stdarg.h가 필요하다. 이 헤더파일에는 va_start, va_end, va_arg, va_copy가 정의되어 있다. 이 중 va_start, va_end, va_arg를 사용한다.

void print(int num, ...)
{

}

가변인자를 가지는 함수를 만들기 위해서는 고정인자가 하나 이상 반드시 필요하고 고정인자들은 가변인자보다 앞에 와야 한다. 고정인자가 필요한 이유는 후술할 va_start의 인자로 사용하기 때문이고 가변인자는 “…”으로 표현한다.

va_list VA_LIST;
va_start(VA_LIST, num);

va_list는 가변인자의 주소를 나타낼 포인터이다.

va_start(va_list, 고정인자)는 초기화 작업으로서 고정인자 바로 뒤에 가변인자들을 위치시키고 va_list에 첫 가변인자의 주소를 할당한다.

for(int i=0; i<num; i++)
{
    int output = va_arg(VA_LIST, int);
    printf("%d ", output);
}

va_arg(va_list, 자료형)는 va_start로 할당한 va_list의 값(가변인자 값)을 리턴한 후 va_list의 주소를 자료형만큼 뒤로 이동시킨다. 그렇게되면 다음 가변인자의 주소값이 va_list로 할당된다. 이를 가변인자 개수만큼 반복하면 모든 가변인자들을 출력할 수 있다.

va_end(VA_LIST);

va_list를 초기화한다.

사용처

서론에서의 예와 같이 사용자 정의 print문을 만들 때 종종 쓰인다. 그 외 쓰이는곳은 아직 보지 못했다.

Leave a Comment