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.

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 Operador Elipse (...) e o Uso da Biblioteca stdarg.h - Linguagem C Reviewed by Dayvid on 00:13 Rating: 5

Um comentário