Em alguns casos podemos
desejar não ter um número de argumentos fixos em nossas funções,
como é caso da função printf. Existe uma forma de implementar esse
mecanismo, bem simples, como veremos a seguir:
va_list
Tipo usado para
armazenar informações sobre nossa lista de argumentos. Ela está
declarada em <stdarg.h>. Existem três macros nesse header
responsáveis por manipular a lista, são elas:
void va_start(va_list
ap, last);
Responsável por
inicializar nossa lista "ap".
type va_arg(va_list ap,
type);
Retorna o próximo
argumento da lista
void va_end(va_list
ap);
Cada va_start precisa
ser finalizada com um va_end.
Para exemplificar,
vamos fazer um função que recebe um número variável de argumentos
do tipo int, e retorna a soma deles.
#include <stdarg.h>
#include <stdio.h>
int IntSum(int TotalNumbers,...){
va_list numbers;
int TotalSum, counter;
va_start(numbers,TotalNumbers);
TotalSum = 0;
for(counter = 0; counter < TotalNumbers;counter++){
TotalSum+=va_arg(numbers,int);
}
va_end(numbers);
return TotalSum;
}
int main(){
printf("\n\t Soma Total 5 + 2 + 3 + 35 = %d",IntSum(4,5,2,3,35));
printf("\n\t Soma Total 10 + 2 = %d",IntSum(2,10,2));
return 1;
}
Após compilar e executar, o resultado deve ser:
Soma Total 5 + 2 + 3 + 35 = 45
Soma Total 10 + 2 = 12
Veja que o primeiro parâmetro indica quantos elementos estamos passando.