Operador Elipse (...) e o Uso da Biblioteca stdarg.h - Linguagem C
Já imaginou como funciona o printf?
Se projetarmos uma função que leva dois argumentos e passamos três parâmetros, vamos receber um erro, ou seja, suponhamos que temos a seguinte função:
Int fun (int a, int b);
E chamamos a função:
fun (2,3,4);
Temos a certeza de obter um erro acima. Então a questão é como o printf / scanf funciona com um número variável de argumentos? Isto é porque C tem um recurso chamado elipses (...) pelo qual você é capaz de passar um número variável de argumentos!
Assim, o protótipo do printf é:
Int printf (const char * str, ...);
Mas a próxima pergunta é como então podemos acessar os argumentos na função?
Simples! A linguagem C possui uma biblioteca que nos ajuda quando estamos com esse desafio, ela simplesmente trata os argumentos que vão estar dentro do operador elipse, vejamos um exemplo:
int func(int, ... ) {
.
.
.
}
int main() {
func(1, 2, 3);
func(1, 2, 3, 4);
}
Note que a função func () tem seu último argumento como elipses, ou seja, três pontos (...) e o seu primeiro argumento como um int que irá representar o número total de argumentos variáveis passados. Para usar essa funcionalidade, você precisa fazer uso do arquivo de cabeçalho stdarg.h que foi citado acima.
Vejamos um exemplo:
Código do projeto:
#include <stdio.h>
#include <stdarg.h>
double media(const int numParam, ...) {
va_list valist;
int cont;
int soma;
va_start(valist, numParam);
for (cont = 0; cont < numParam; cont++) {
soma += va_arg(valist, int);
}
va_end(valist);
return soma/numParam;
}
int main() {
printf("media entre os numeros = %f", media(3, 10,20, 5));
return 0;
}
Documentação da aula:
The stdarg.h header defines a variable type va_list and three macros which can be used to get the arguments in a function when the number of arguments are not known i.e. variable number of arguments.
A function of variable arguments is defined with the ellipsis (,...) at the end of the parameter list.
Se projetarmos uma função que leva dois argumentos e passamos três parâmetros, vamos receber um erro, ou seja, suponhamos que temos a seguinte função:
Int fun (int a, int b);
E chamamos a função:
fun (2,3,4);
Temos a certeza de obter um erro acima. Então a questão é como o printf / scanf funciona com um número variável de argumentos? Isto é porque C tem um recurso chamado elipses (...) pelo qual você é capaz de passar um número variável de argumentos!
Assim, o protótipo do printf é:
Int printf (const char * str, ...);
Mas a próxima pergunta é como então podemos acessar os argumentos na função?
Simples! A linguagem C possui uma biblioteca que nos ajuda quando estamos com esse desafio, ela simplesmente trata os argumentos que vão estar dentro do operador elipse, vejamos um exemplo:
int func(int, ... ) {
.
.
.
}
int main() {
func(1, 2, 3);
func(1, 2, 3, 4);
}
Note que a função func () tem seu último argumento como elipses, ou seja, três pontos (...) e o seu primeiro argumento como um int que irá representar o número total de argumentos variáveis passados. Para usar essa funcionalidade, você precisa fazer uso do arquivo de cabeçalho stdarg.h que foi citado acima.
Vejamos um exemplo:
Código do projeto:
#include <stdio.h>
#include <stdarg.h>
double media(const int numParam, ...) {
va_list valist;
int cont;
int soma;
va_start(valist, numParam);
for (cont = 0; cont < numParam; cont++) {
soma += va_arg(valist, int);
}
va_end(valist);
return soma/numParam;
}
int main() {
printf("media entre os numeros = %f", media(3, 10,20, 5));
return 0;
}
Documentação da aula:
The stdarg.h header defines a variable type va_list and three macros which can be used to get the arguments in a function when the number of arguments are not known i.e. variable number of arguments.
A function of variable arguments is defined with the ellipsis (,...) at the end of the parameter list.
Library Variables
Following is the variable type defined in the header stdarg.h −
Variable & Description | |
---|---|
1 | va_list This is a type suitable for holding information needed by the three macros va_start(), va_arg() and va_end(). |
Library Macros
Following are the macros defined in the header stdarg.h −Macro & Description | |
---|---|
1 | void va_start(va_list ap, last_arg) This macro initializes ap variable to be used with the va_arg and va_end macros. The last_arg is the last known fixed argument being passed to the function i.e. the argument before the ellipsis. |
2 | type va_arg(va_list ap, type) This macro retrieves the next argument in the parameter list of the function with type type. |
3 | void va_end(va_list ap) This macro allows a function with variable arguments which used the va_start macro to return. If va_end is not called before returning from the function, the result is undefined. |
Retirado de: https://www.tutorialspoint.com/c_standard_library/stdarg_h.htm |
Operador Elipse (...) e o Uso da Biblioteca stdarg.h - Linguagem C
Reviewed by Dayvid
on
00:13
Rating:
Muito bom , descobri coisas que não sabia sobre esta biblioteca.
ResponderExcluir