BUSCAR
INICIO
MAPA
FAQs
UTILIDADES
GLOSARIO
REGISTRO
COLABORAR
QUIENES SOMOS

USUARIO

PASSWORD

FAQs
5. Funciones

2.¿Como puedo crear una función con un número variable de argumentos?

En ocasiones, podemos querer escribir una función que use un número variable de argumentos como parámetros. La función printf es un buen ejemplo de esto. C tiene tres macros definidas en la cabecera estándar stdarg.h que permiten utilizar un número variable de argumentos.

También se pueden usar en C++, pero para ello necesitamos eliminar la comprobación de tipo que el compilador hace con todas las funciones en C++. Para ello se utilizan tres puntos en la lista de argumentos de la función.

Veamos un ejemplo:

# include <iostream.h>
# include <stdarg.h>
void display_var(int number, ...);
main()
{
int index = 5;
int one = 1, two = 2;
display_var (one, index);
display_var (3, index, index + two, index + one);
display_var (two, 7 ,3);
}
void display_var (int number, ...);
{
va_list param_pt;
va_start(param_pt, number);
cout << "The parameters are " ;
for (int index = 0; index < number; index ++)
cout << va_arg(param_pt, int) << " " ;
cout << '\n';
  va_end (param_pt); }

La salida de este programa será:
The parameters are 5.
The parameters are 5 7 6.
The parameters are 7 3.

Observamos que:

  • El prototipo dice que se requiere como primer parámetro un argumento de tipo int. Después, el compilador no comprobará el tipo.
  • El programa principal consiste de tres llamadas a la función, cada una con un número diferente de parámetros, pero el compilador no advierte de la diferencia en las tres llamadas. De hecho, se pueden poner tantos tipos diferentes como se deseen. Siempre que el primer parámetro sea un entero, el programa compilará y se ejecutará sin ningún problema.
  • En este caso, el primer parámetro indica el número de parámetros adicionales que se le van a pasar. La función simplemente imprime en pantalla los números.

Estudiemos la definición de la función:

  • Primero se define una va_list, llamada param_pt, y se inicializa llamando a la función va_start().
  • La función va_start() tiene como argumentos el nombre de la va_list y el nombre del último argumento formal que se ha pasado a la función.
  • La macro va_arg() se utiliza para acceder a los argumentos sin nombre por orden. En cada llamada debe especificarse un tipo: va_arg supone que se le ha pasado un argumento real de ese tipo, pero no tiene forma de verificarlo.
  • Antes de que la función en la que se ha utilizado va_start() devuelva algún valor, debe llamarse a va_end(). La razón es que va_start() puede modificar la lista de parámetros de forma que el return no puede ser hecho correctamente; va_end() no hace estas modificaciones.

Un programa bien diseñado necesita algunas funciones en las que el tipo de argumentos no está completamente especificado. La sobrecarga de funciones y el uso de parámetros por defecto deben ser usados para resolver estas situaciones. Sólo cuando el número de argumentos y el tipo de argumentos varían se debe utilizar las funciones con número variable de argumentos. Naturalmente, el uso de un número variable de argumentos en una función conduce a un código oscuro y apenas debe ser usado.

.