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