C Parámetros variables

A veces, puede encontrarse con una situación en la que desea que una función tenga un número variable de parámetros, en lugar de un número predefinido de parámetros.

El lenguaje C proporciona una solución para esta situación, que le permite definir una función que pueda aceptar un número variable de parámetros según las necesidades específicas.

La forma de declaración es:

int func_name(int arg1, ...);

Donde, los puntos suspensivos...representan la lista de parámetros variables.

El siguiente ejemplo demuestra el uso de este tipo de función:

int func(int, ... ) { . . . } int main() { func(2, 2, 3); func(3, 2, 3, 4); }

Tenga en cuenta que la funciónfunc()el último parámetro se escribe como puntos suspensivos, es decir, tres puntos (...), el parámetro anterior a los puntos suspensivos esint, que representa el número total de parámetros variables a pasar. Para usar esta funcionalidad, necesita usarstdarg.hel archivo de cabecera, que proporciona las funciones y macros para implementar la funcionalidad de parámetros variables. Los pasos específicos son:

  • Defina una función con puntos suspensivos como último parámetro; antes de los puntos suspensivos puede establecer parámetros personalizados.
  • En la definición de la función, cree unava_listvariable de tipo, que está definida en el archivo de cabecera stdarg.h.
  • Useintel parámetro yva_start()la macro para inicializarva_listla variable como una lista de parámetros. La macrova_start()está definida en el archivo de cabecera stdarg.h.
  • Useva_arg()la macro yva_listla variable para acceder a cada elemento de la lista de parámetros.
  • Use la macrova_end()para limpiar la memoria asignada ava_listla variable.

Las macros comunes son:

  • va_start(ap, last_arg): inicializa la lista de parámetros variables.apes unava_listvariable de tipolast_arges el nombre del último parámetro fijo (es decir, el parámetro anterior a la lista de parámetros variables). Esta macro hace queapapunte al primer parámetro de la lista de parámetros variables.

  • va_arg(ap, type): obtiene el siguiente parámetro de la lista de parámetros variables.apes unava_listvariable de tipotypees el tipo del siguiente parámetro. Esta macro devuelve un valor de tipotypey hace queapapunte al siguiente parámetro.

  • va_end(ap): finaliza el acceso a la lista de parámetros variables.apes unava_listvariable de tipo. Esta macro estableceapaNULL。

Ahora, siguiendo los pasos anteriores, escribamos una función con un número variable de parámetros y devolvamos su promedio:

Ejemplo

#include <stdio.h> #include <stdarg.h> double average(int num,...) { va_list valist; double sum = 0.0; int i; /*Inicializar valist para num parámetros*/ va_start(valist, num); /*Acceder a todos los parámetros asignados a valist*/ for (i = 0; i < num; i++) { sum += va_arg(valist, int); } /*Limpiar la memoria reservada para 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)); }

En el ejemplo anterior, la función average() acepta un entero num y cualquier cantidad de parámetros enteros. Dentro de la función, se utiliza una variable de tipo va_list, llamada va_list, para acceder a la lista de parámetros variables. En el bucle, cada vez se usa la macro va_arg() para obtener el siguiente parámetro entero y se muestra. Finalmente, al final de la función, se usa la macro va_end() para finalizar el acceso a la lista de parámetros variables.

Cuando el código anterior se compila y ejecuta, produce los siguientes resultados. Cabe señalar que la función average()se llama dos veces, y cada vez el primer parámetro representa el número total de parámetros variables pasados. Los puntos suspensivos se utilizan para pasar un número variable de parámetros.

Average of 2, 3, 4, 5 = 3.500000
Average of 5, 10, 15 = 10.000000
Otras extensiones