next up previous contents
Next: Sobrecarga de nome de Up: Funções Previous: Parâmetros default   Sumário

Número variável de argumentos

Em algumas raras ocasiões, pode ser desejável definir uma função com um número variável de argumentos -- um bom exemplo deste tipo de necessidade é a função printf. Como em ANSI-C, C ++ pode usar macros definidas em stdarg.h para atingir este objetivo. Entretanto, como C ++ é mais rígido com relação à prototipagem de funções, é preciso um mecanismo que indique esta liberdade no número de argumentos. Este mecanismo é o uso de três pontos ... no protótipo da função.

O exemplo a seguir ilustra o uso deste mecanismo.

indentation

#include $<$iostream.h$>$
#include $<$stdarg.h$>$

// Declare a function with one required parameter
void display_var(int number, $\ldots$);

main()
{
int index = 5;
int one = 1, two = 2;

display_var(one, index);
display_var(3, index, index + two, index + one);
display_var(two, 7, 3);
}


void display_var(int number, $\ldots$)
{
va_list param_pt;

va_start(param_pt,number); // Call the setup macro

cout $\ll$ "The parameters are ";
for (int index = 0 ; index $<$ number ; index++)
cout $\ll$ va_arg(param_pt,int) $\ll$ ; // Extract a parameter
cout $\ll$ begintex2html_wrap_inline$$n";
va_end(param_pt); // Closing macro
}
Neste exemplo, o protótipo indica que um argumento do tipo int é requerido na chamada da função; após este argumento, o compilador não faz mais nenhuma verificação de tipos de dados sendo passado para a função. É tarefa do programador garantir que os dados sendo passados são do tipo esperado.

O resultado da execução deste exemplo simples é apresentado abaixo.

    The parameters are 5
    The parameters are 5 7 6
    The parameters are 7 3

Este mecanismo, apesar de presente por questões de completude da linguagem, deve ser evitado. Seu uso pode levar à obscuridade de código, tornando entendimento e manutenção tarefas mais difíceis.


next up previous contents
Next: Sobrecarga de nome de Up: Funções Previous: Parâmetros default   Sumário
Ivan Luiz Marques Ricarte 2001-06-01