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.