C - Argumentos variables

A veces, puede encontrarse con una situación, en la que desee tener una función, que puede tomar un número variable de argumentos, es decir, parámetros, en lugar de un número predefinido de parámetros. El lenguaje de programación C proporciona una solución para esta situación y se le permite definir una función que puede aceptar un número variable de parámetros según sus requisitos. El siguiente ejemplo muestra la definición de dicha función.

int func(int, ... ) {
   .
   .
   .
}

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

Cabe señalar que la función func() tiene su último argumento como elipses, es decir, tres puntos (...) y el que está justo antes de las elipses es siempre un intque representará el número total de argumentos variables pasados. Para utilizar dicha funcionalidad, debe hacer uso destdarg.h archivo de encabezado que proporciona las funciones y macros para implementar la funcionalidad de los argumentos variables y seguir los pasos dados:

  • Defina una función con su último parámetro como elipses y el que está justo antes de las elipses es siempre un int que representará el número de argumentos.

  • Crear un va_listtipo variable en la definición de función. Este tipo se define en el archivo de encabezado stdarg.h.

  • Utilizar int parámetro y va_start macro para inicializar el va_listvariable a una lista de argumentos. La macro va_start se define en el archivo de encabezado stdarg.h.

  • Utilizar va_arg macro y va_list variable para acceder a cada elemento en la lista de argumentos.

  • Usa una macro va_end para limpiar la memoria asignada a va_list variable.

Ahora sigamos los pasos anteriores y escribamos una función simple que puede tomar el número variable de parámetros y devolver su promedio:

#include <stdio.h>
#include <stdarg.h>

double average(int num,...) {

   va_list valist;
   double sum = 0.0;
   int i;

   /* initialize valist for num number of arguments */
   va_start(valist, num);

   /* access all the arguments assigned to valist */
   for (i = 0; i < num; i++) {
      sum += va_arg(valist, int);
   }
	
   /* clean memory reserved for 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));
}

Cuando el código anterior se compila y ejecuta, produce el siguiente resultado. Cabe señalar que la funciónaverage()se ha llamado dos veces y cada vez el primer argumento representa el número total de argumentos variables que se pasan. Solo se utilizarán puntos suspensivos para pasar un número variable de argumentos.

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