실험 환경
- OS: Ubuntu 18.04
- g++: 7.5.0
C/C++에서 함수를 만들 때 인자의 개수가 정해져 있지 않은 경우 가변 인자를 사용해서 편리하게 함수를 제작할 수 있다. 저의 경우 Debug를 위한 나만의 Printf를 제작하는 과정에서 사용하였다. 가변 인자 사용방법에 대해서 간단히 정리해보았다.
사용 방법
- 함수 인자 부분에 “…” 을 추가함
- 예: mkFindMin(int numArg, …) {}
- va_list( )를 사용해서 Variable Argument 변수를 생성함
- va_start( ) 를 사용해서 가변 인자를 사용할 수 있도록 변경함
- va_arg(va_list 변수 이름, Type)을 사용해서 변수를 Loading함
- 예: int min = va_arg(va_list_name, int);
- 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;
}
출처
- https://stackoverflow.com/questions/41400/how-to-wrap-a-function-with-variable-length-arguments
- https://www.geeksforgeeks.org/variable-length-argument-c/#:~:text=Variable%20length%20argument%20is%20a,of%20arguments%20according%20to%20requirement.