Para indicar al compilador que puede aparecer un número variable de parámetros, el prototipo de la función finaliza con puntos suspensivos. Por ejemplo: int suma(int a, int b, …).
Esto le indica al compilador que la función suma tiene dos parámetros de tipo int que deben aparecer como mínimo, pero que puede recibir más de cualquier tipo.
Para acceder a esos parámetros no definidos en la cabecera, el estándar ANSI C define tres funciones y un tipo incluidos en el archivo de cabecera stdarg.h. El tipo que define es un array que contiene información necesaria para las funciones. Dichas funciones son:
void va_start(va_list ap, lastfix): inicializa el array ap. Esta función debe ser llamada antes de acceder a los parámetros variables. El parámetro lastfix ha de ser el nombre del último parámetro fijo que recibe la función.
tipo va_arg(va_list ap, tipo): devuelve el siguiente parámetro de tipo tipo, de la lista de parámetros. Asimismo incrementa la posición de ap de forma que apunte al siguiente parámetro al que devuelve.
void va_end(va_list ap): elimina la información en el array ap. Debe ser llamada cuando ya no se va a acceder más veces a los parámetros, pero antes de salir de la función.
Vamos a verlo con un ejemplo:
/* Ejemplo de función con numero variable de parámetros */
#include <stdio.h>
#include <stdarg.h>
/* Declaración Prototipo de la función PedirNum */
int PedirNum(void);
/* Declaración Prototipo de la función suma */
long suma(unsigned char Numero, long Num1, long Num2, …);
int main()
{
/* Definimos tres enteros */
long Num1,Num2,Num3;
/* Pedimos valores para esas variables */
Num1=PedirNum();
Num2=PedirNum();
Num3=PedirNum();
/* Realizamos la operacion */
printf(«%li+%li=%li\n»,Num1,Num2,suma(2,Num1,Num2));
printf(«%li+%li=%li\n»,Num1,Num3,suma(2,Num1,Num3));
printf(«%li+%li=%li\n»,Num2,Num3,suma(2,Num2,Num3));
printf(«%li+%li+%li=%li\n»,Num1,Num2,Num3,suma(3,Num1,Num2,Num3));
return(0);
}
/* Definicion de PedirNum */
int PedirNum(void)
{
int Num;
printf(«Introduzca un numero: «);
scanf(«%i»,&Num);
return(Num);
}
/* Definición de Suma */
long suma(unsigned char Numero,long Num1,long Num2,…)
{
long Res;
va_list Param;
Res=Num1+Num2;
Numero-=2;
va_start(Param,Num2);
while (Numero>0)
{
Res+=va_arg(Param,long);
Numero++;
}
va_end(Param);
return(Res);
}
Este ejemplo solo nos vale si el número de argumentos es igual o inferior al primer parámetro, porque de no ser así, la función no tiene forma alguna de determinar el número de argumentos recibidos.