C 언어 가변 인자 마스터하기: 실전 가이드
미리 정해진 매개변수 개수 대신 가변 개수의 인자, 즉 매개변수를 받을 수 있는 함수가 필요한 상황을 마주할 수 있습니다. C 프로그래밍 언어는 이 상황에 대한 해결책을 제공하며, 요구사항에 따라 가변 개수의 매개변수를 허용하는 함수를 정의할 수 있습니다. 다음 예제는 그러한 함수의 정의를 보여줍니다.
int func(int, ...) {
...
}
int main() {
func(1, 2, 3);
func(1, 2, 3, 4);
}
함수 func()의 마지막 인자가 생략 부호(세 개의 점 ...)이고, 생략 부호 바로 앞의 인자가 항상 가변 인자의 총 개수를 나타내는 int라는 점에 유의하세요. 이러한 기능을 사용하려면 stdarg.h 헤더 파일을 활용해야 합니다. 이 헤더는 가변 인자 기능 구현에 필요한 함수와 매크로를 제공하며, 다음 단계를 따릅니다.
마지막 매개변수를 생략 부호로 하고, 생략 부호 바로 앞의 매개변수를 인자의 개수를 나타내는 int로 하여 함수를 정의합니다.
함수 정의에서 va_list 타입 변수를 생성합니다. 이 타입은 stdarg.h 헤더 파일에 정의되어 있습니다.
int 매개변수와 va_start 매크로를 사용하여 va_list 변수를 인자 목록으로 초기화합니다. va_start 매크로는 stdarg.h에 정의되어 있습니다.
va_arg 매크로와 va_list 변수를 사용하여 인자 목록의 각 항목에 접근합니다.
va_end 매크로를 사용하여 va_list 변수에 할당된 메모리를 정리합니다.
이제 위 단계를 따라 가변 개수의 매개변수를 받아 평균을 반환하는 간단한 함수를 작성해 보겠습니다.
Live Demo
#include <stdio.h>
#include <stdarg.h>
double average(int num, ...) {
va_list valist;
double sum = 0.0;
int i;
/* num 개수의 인자로 valist 초기화 */
va_start(valist, num);
/* valist에 할당된 모든 인자에 접근 */
for (i = 0; i < num; i++) {
sum += va_arg(valist, int);
}
/* valist에 예약된 메모리 정리 */
va_end(valist);
return sum / num;
}
int main() {
printf("Average of 2, 3, 4, 5 = %f\n", average(4, 2, 3, 4, 5));
printf("Average of 5, 10, 15 = %f\n", average(3, 5, 10, 15));
}
위 코드를 컴파일하고 실행하면 다음과 같은 결과가 나옵니다. average() 함수가 두 번 호출되었으며, 각 호출에서 첫 번째 인자가 전달되는 가변 인자의 총 개수를 나타낸다는 점에 유의하세요. 가변 인자 전달에는 생략 부호만 사용됩니다.
Average of 2, 3, 4, 5 = 3.500000
Average of 5, 10, 15 = 10.000000