Funções em C podem ser declaradas de forma que suportem vários parâmetros de um mesmo
tipo ou tipos diferentes. Na declaração de uma função, devemos informar um
parâmetro que armazena a quantidade de parâmetros e outro parâmetros que irá receber
um array de parâmetros. 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
Uma função para suporta vários parâmetros segue a sintaxe abaixo:
Sintaxe: função
tipo_retorno nome_funcao(int num_params,...)
{
//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 a função.
Essa lista é 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.