C/stdarg.h
Este ficheiro de cabeceira permite que as funcións poidan recibir un número indefinido de argumentos. Pode incluírse nun código fonte mediante a seguinte directriz:
#include <stdarg.h>
Declaración e definición de funcións con argumentos indefinidos
editarAs funcións que poden recibir un número variable e indefinido de argumentos defínense con puntos suspensivos como último parámetro. Un exemplo de declaración podería ser o seguinte:
int comprobar(int a, double b, ...);
Este tipo de funcións deben ter polo menos un parámetro identificado, polo que un exemplo como o seguinte non sería correcto:
int incorrecto(...);
O mesmo se aplica para a definición. Seguindo o exemplo correcto anterior:
int comprobar(int a, double b, ...){
// Ordes da función.
}
Tipos
editarTipo | Descrición |
---|---|
va_list |
Tipo para argumentos iterativos. |
Claves
editarClave | Descrición |
---|---|
va_start |
Iniciar os argumentos iterativos cun va_list . |
va_arg |
Recibir un argumento. |
va_end |
Liberar un va_list . |
va_copy |
Copiar o contido dun va_list noutro. |
Acceder aos argumentos indefinidos
editarPara acceder aos argumentos indefinidos, hai que declarar unha variable do tipo v_list
na función con argumentos indefinidos. Nese momento chámase á clave va_start
con dous argumentos: o primeiro é o declarado do tipo va_list
e o segundo é o nome do último parámetro chamado da función. Despois cada chamada á clave va_arg
dá paso ao seguinte argumento. O primeiro argumento para va_arg
é o va_list
e o seguinte é do tipo do seguinte argumento fornecido á función. Para rematar, a clave va_end
debe chamarse dende o va_list
antes de que a función devolva a execución (non é obrigatorio ler todos os argumentos).
Non existe ningún mecanismo para determinar a cantidade ou o tipo dos argumentos indefinidos pasados á función. A función debe sabelo ou determinalo dalgún xeito, que varía segundo o caso. Entre as convencións máis comúns están:
- Utilizar unha cadea cun formato similar ao usado por funcións coma
printf()
ouscanf()
con especificadores incluídos que indiquen o tipo dos argumentos. - Un valor sentinela ao final dos argumentos indefinidos.
- Un contador de argumentos sinalando a cantidade de argumentos indefinidos.