Linguagem C - Funções Variádicas

Artigo com o intuito de demonstrar o funcionamento de funções com número variável de argumentos. As famosas funções declaradas como func(int, ...).

[ Hits: 15.645 ]

Por: Enzo de Brito Ferber em 20/04/2016 | Blog: http://www.maximasonorizacao.com.br


stdarg.h



O comando 'man stdarg' lhe dará todas as informações necessárias. Esta página é apenas um resumo do que você encontrará nesse manual. Na seção de referências há um link para o manual online.

#include <stdarg.h>

void va_start(va_list ap, last);
type va_arg(va_list ap, type);
void va_end(va_list ap);
void va_copy(va_list dest, va_list src);

va_list

Tipo de dados usado para manipular a lista de argumentos. A variável definida com este tipo provavelmente é um ponteiro, mas isso é irrelevante para nós (abstração!). Mas é necessário saber que antes de utilizar essa variável precisamos inicializá-la usando...

va_start

Ela toma dois argumentos, uma variável do tipo va_list e o nome da última variável conhecida na lista de parâmetros. Como os argumentos podem ser passados na pilha ou em registradores, essa função torna-se necessária para posicionar o ponteiro corretamente no Stack Frame da função ou para alocar memória e copiar os valores dos registradores utilizados. Depois de inicializada, podemos acessar os argumentos através da macro...

va_arg

Que retornará o próximo argumento da lista apontada pela variável de tipo va_list. Também toma dois argumentos, a variável va_list e o tipo de dados do argumento. Já que são argumentos variáveis, podem também ser de tipos variáveis, e nós é que informamos os tipos corretamente. Quando terminamos de manipular os argumentos, chamamos a macro...

va_end

Necessária para liberar memória (caso tenha sido alocada) e em alguma implementações fechar o bloco. Em algumas versões da biblioteca, va_start abre um bloco com {, e não terminar a função com va_end resultará em erro de compilação. Essa macro toma apenas um argumento de tipo va_list.

va_copy

Existem algumas funções que tomam como argumentos uma lista de parâmetros variáveis (va_list). Como por exemplo vprintf() e vscanf(). Sendo va_list um ponteiro, essas funções irão modificar o local para onde ele aponta. Se você não precisar mais do ponteiro após chamar tais funções, não precisará de uma cópia. Entretanto, se for usar a lista novamente, você vai precisar. Na maior parte das implementações, va_list é apenas um ponteiro para um local no Stack Frame da função, e é seguro fazer:

va_list ap;
va_start(ap, last);
va_list aq = ap;

Entretanto, algumas implementações declaram 'ap' como um vetor de ponteiros, e aí seria necessário fazer:

*aq = *ap;

Como não queremos nos preocupar com isso, podemos simplesmente utilizar va_copy.

A biblioteca stdarg.h não permite que uma função não tenha argumentos fixos. Portanto, ao menos um parâmetro é necessário. Entretanto, há a biblioteca mais antiga varargs.h que permite isso. O manual de stdarg(3) dá um exemplo sobre como utilizá-la.

Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. stdarg.h
   3. Exemplos
   4. Expandindo horizontes
   5. MACROS Variádicas
   6. Conclusão e referências
Outros artigos deste autor

Linguagem C - Árvores Binárias

Linguagem C - Listas Duplamente Encadeadas

Leitura recomendada

Estudando recursividade direta e indireta

Bug afeta todas as distros

Alocação dinâmica de memória em C

Sinais em Linux

Tratamento de exceções na linguagem C

  
Comentários
[1] Comentário enviado por sacioz em 21/04/2016 - 10:15h

Gostei , com certeza vou dar um controldê na pag.inicial
Obrigado...:-))

[2] Comentário enviado por removido em 21/04/2016 - 18:14h

Muito bom. Vou guardar como referência.

----------------------------------------------------------------------------------------------------------------
# apt-get purge systemd (não é prá digitar isso!)

Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden

[3] Comentário enviado por EnzoFerber em 30/04/2016 - 12:49h

Muito obrigado, @sacioz e @listeiro_037.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts