Todos já viram como faz uma função, mas se alguém ficou curioso para saber como funciona algumas funções no C/C++ como a printf() e scanf() que a quantidade de argumentos é variável, fique sabendo que é possível fazer isso com qualquer função. Veja como fazer:
Sempre inclua a biblioteca stdarg.h no C ou cstdarg no C++ para usar as funções de parâmetros variáveis.
Existem 3 funções e um tipo de dado que irão ser necessárias dentro da função na qual vai querer ter parâmetros indefinidos, São elas:
void va_arg(va_list argptr,tipo de dado do parâmetro variável);
type va_start(va_list argptr,nome do último parâmetro conhecido);
void va_end(va_list argptr);
Para fazer uma função com número variável de argumentos, faça o seguinte:
Inclua a biblioteca stdarg.h no C ou cstdarg no C++;
Declare a função com pelo menos um parâmetro conhecido (para o controle do número de argumentos variáveis que irão ser passados na função);
Ex.: void imprimeStrings(int parametroConhecido,...); (inclua reticências no lugar do segundo parâmetro)
Sempre encerre a função com a função va_end();
Exemplo de programa:
#include <stdio.h> #include <stdarg.h> // Sempre inclua essa biblioteca! #include <conio.h> // Biblioteca para a função getch().
void imprimeNumeros(int ,...);
int main(int argc,char **argv) { imprimeNumeros(5,5,4,3,2,1); getch(); imprimeNumeros(4,5,4,3,2); getch(); return 0; } void imprimeNumeros(int quantidadeDeParametros,...) { int numero; int contador; va_list argptr; // Declare uma variável do tipo va_list na função, o nome "argptr" pode ser trocado. va_start(argptr,quantidadeDeParametros); /* Inicie a função va_start colocando o nome da variável de tipo va_list declarada anteriormente e o nome do último parâmetro conhecido*/ for(contador=1;contador<=quantidade;contador++) /* Estabeleça uma forma de controle, pois a função não saberá quantos parâmetros recebeu.*/ { numero=va_arg(argptr,int); printf("%d\n",numero); /* Cada vez que for acionada, a va_arg retornará o valor de um parâmetro variável, caso acabem os parâmetros variáveis, ele retornará lixo de memória, necessitando de um controle. O va_arg tem como parâmetro a variável va_list declarada anteriormente e o tipo de dado do argumento variável.*/ } va_end(argptr); // Sempre coloque a função va_end no final. A va_end recebe o nome da variável va_list declarada anteriormente. return; } [/codebox]
Vale lembrar que a função não sabe quantos argumentos variáveis recebeu e o tipo delas (se é int, float, etc.) e o va_arg sempre que for acionada, retornará um parâmetro variável. Quando acabar os parâmetros variáveis, ele retornará lixo de memória.
O primeiro parâmetro da função deve ser um meio da função saber quantos parâmetros que está recebendo.
Utilizamos cookies e tecnologias semelhantes de acordo com a nossa Política de Privacidade, e ao continuar navegando, você concorda com estas condições.
Pergunta
bruce845
Todos já viram como faz uma função, mas se alguém ficou curioso para saber como funciona algumas funções no C/C++ como a printf() e scanf() que a quantidade de argumentos é variável, fique sabendo que é possível fazer isso com qualquer função. Veja como fazer:
Sempre inclua a biblioteca stdarg.h no C ou cstdarg no C++ para usar as funções de parâmetros variáveis.
Existem 3 funções e um tipo de dado que irão ser necessárias dentro da função na qual vai querer ter parâmetros indefinidos, São elas:
void va_arg(va_list argptr,tipo de dado do parâmetro variável);
type va_start(va_list argptr,nome do último parâmetro conhecido);
void va_end(va_list argptr);
Para fazer uma função com número variável de argumentos, faça o seguinte:
- Inclua a biblioteca stdarg.h no C ou cstdarg no C++;
- Declare a função com pelo menos um parâmetro conhecido (para o controle do número de argumentos variáveis que irão ser passados na função);
- Sempre encerre a função com a função va_end();
Exemplo de programa:Ex.: void imprimeStrings(int parametroConhecido,...); (inclua reticências no lugar do segundo parâmetro)
Vale lembrar que a função não sabe quantos argumentos variáveis recebeu e o tipo delas (se é int, float, etc.) e o va_arg sempre que for acionada, retornará um parâmetro variável. Quando acabar os parâmetros variáveis, ele retornará lixo de memória.
O primeiro parâmetro da função deve ser um meio da função saber quantos parâmetros que está recebendo.
Espero ter ajudado!
Editado por bruce845Link para o comentário
Compartilhar em outros sites
0 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.