C 변수 매개변수
때때로 함수가 미리 정의된 수의 매개변수 대신 가변적인 수의 매개변수를 사용하기를 원하는 상황에 직면할 수 있습니다. C 언어는 특정 요구 사항에 따라 가변 개수의 인수를 허용하는 함수를 정의할 수 있도록 하여 이러한 상황에 대한 솔루션을 제공합니다. 다음 예에서는 이러한 함수의 정의를 보여줍니다.
int func(int, ... ) { . . .}int main(){ func(1, 2, 3); func(1, 2, 3, 4);}
함수의 마지막 매개변수 func()는 줄임표, 즉 점 3개(...)로 작성된다는 점에 유의하세요. 줄임표 앞의 매개변수는 항상 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 변수에 할당된 메모리를 정리하세요.
이제 위의 단계에 따라 가변 개수의 인수를 취하고 평균값을 반환하는 함수를 작성해 보겠습니다.
#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() 함수는 두 번 호출되며, 매번 첫 번째 매개변수는 전달된 변수 매개변수의 총 개수를 나타냅니다. 타원은 가변 개수의 인수를 전달하는 데 사용됩니다.
rreee