Funções em C podem ser declaradas de forma a suportar vários parâmetros de um mesmo tipo ou
tipos diferentes utilizando um parâmetro para informar que a função suporta vários parâmetros,
e outro para informar a quantidade de parâmetros informados. Para isso, precisamos adicionar a
biblioteca stdard:
Sintaxe
#include <stdarg.h>
Essa biblioteca fornece as funções e tipos listados abaixo:
- va_list — tipo de dado para armazenar os parâmetros variáveis
- va_start(va_list, numero_parametros) — Função para iniciar lista de parâmetros
- va_arg(va_list, tipo_dado) — função que retorna próximo parâmetro
- va_end(va_list) — função para limpa va_list
Sintaxe: função
tipo_retorno nome_funcao(num_params int,...)
{
//omitido
}
Onde
…: operador de parâmetros variáveis
num_params: número de parâmetros informados. Obrigatório
Com o tipo va_list, armazenamos a lista de argumentos passados para uma função que é criada
pela função va_start. Com um comando de repetição, acessamos o argumento utilizando a
função va_arg.
Exemplo 4
#include <stdio.h>
#include <stdarg.h>
void funcao(int num_params, ...)
{
va_list params; //armazena ...
va_start(params,num_params);
for (int varg = 0; varg < num_params; varg++)
printf("%d ", va_arg(params, int)); //tipo int
va_end(params); //libera lista
}
int main()
{
funcao(5,1,0,-1,-20,30,40);
printf("\n");
funcao(5,0x1,0x0,0xffffffff,0xFFFFFFEC,0x1e,0x28);
}
Saída
1 0 -1 -20 30
1 0 -1 -20 30
Não há como checar os tipos de dados de lista variáveis de parâmetros. Cada argumento passado
deve ter seu valor tratado de acordo com o tipo de dado desejado.
No caso de argumentos com tipos de dados diferentes, as posições em que esses tipos estão
devem ser tratados de acordo com os tipos esperados.