[C/C++] 가변 인자 사용 방법 (Variable Length Argument)

실험 환경

  • OS: Ubuntu 18.04
  • g++: 7.5.0

C/C++에서 함수를 만들 때 인자의 개수가 정해져 있지 않은 경우 가변 인자를 사용해서 편리하게 함수를 제작할 수 있다. 저의 경우 Debug를 위한 나만의 Printf를 제작하는 과정에서 사용하였다. 가변 인자 사용방법에 대해서 간단히 정리해보았다.

사용 방법

  1. 함수 인자 부분에 “…” 을 추가함
    • 예: mkFindMin(int numArg, …) {}
  2. va_list( )를 사용해서 Variable Argument 변수를 생성함
  3. va_start( ) 를 사용해서 가변 인자를 사용할 수 있도록 변경함
  4. va_arg(va_list 변수 이름, Type)을 사용해서 변수를 Loading함
    • 예: int min = va_arg(va_list_name, int);
  5. va_end( )를 호출해서 변수 사용을 종료함

위 순서대로 코드를 작성하면 가변 인자를 사용할 수 있다. 아래 코드 1은 mkPrintf(…)와 mkFindMin(…) 예제 코드이다. mkPrintf(…)함수는 printf(…)를 대체해보았고, mkFindMin(…)은 최소 값을 찾는 함수이다.

mkPrintf(…) 함수를 보면 printf(…)대신 vprintf(…)를 사용하였다. 가변 인자를 사용하는 경우 printf(…)를 사용하면 값이 정확하게 출력되지 않는 문제가 있다고 한다 (출처 1).

코드 1: 가변 인자 사용 예제 코드 (출처 1, 2)

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

//MK: printf와 동일한 기능을 하도록 구현함 
void mkPrintf(char *fmt, ...){
    va_list args;
    va_start(args, fmt);
    vprintf(fmt, args);
    va_end(args);
}

//MK: 최소값을 찾기 위한 함수를 구현함
int mkFindMin(int argNum, ...){
    va_list args;
    va_start(args, argNum);
    int minValue = __INT_MAX__;
    for(int i = 1; i <= argNum; i++){
        int tmp = va_arg(args, int);
        if(tmp < minValue){
            minValue = tmp;
        }
    }
    va_end(args);
    return minValue;
}

int main(){
    int test = 10;
    mkPrintf("(MK) Print %d\n", test);
    printf("(MK) Min Value Test %d\n", mkFindMin(5, 100, 200, 300, 400, test));
    return 0;
}

출처

  1. https://stackoverflow.com/questions/41400/how-to-wrap-a-function-with-variable-length-arguments
  2. https://www.geeksforgeeks.org/variable-length-argument-c/#:~:text=Variable%20length%20argument%20is%20a,of%20arguments%20according%20to%20requirement.

Leave a Comment