sexta-feira, 2 de novembro de 2012

Funções com argumentos variáveis – va_list



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.