C - Argumentos Variáveis

Às vezes, você pode se deparar com uma situação, quando deseja ter uma função, que pode levar um número variável de argumentos, ou seja, parâmetros, em vez de um número predefinido de parâmetros. A linguagem de programação C fornece uma solução para esta situação e você pode definir uma função que pode aceitar um número variável de parâmetros com base em seus requisitos. O exemplo a seguir mostra a definição de tal função.

int func(int, ... ) {
   .
   .
   .
}

int main() {
   func(1, 2, 3);
   func(1, 2, 3, 4);
}

Deve-se notar que a função func() tem seu último argumento como elipses, ou seja, três dotes (...) e aquele imediatamente antes das elipses é sempre um intque representará o número total de argumentos variáveis ​​passados. Para usar essa funcionalidade, você precisa fazer uso destdarg.h arquivo de cabeçalho que fornece as funções e macros para implementar a funcionalidade de argumentos variáveis ​​e seguir as etapas fornecidas -

  • Defina uma função com seu último parâmetro como elipses e aquele imediatamente antes das elipses é sempre um int que representará o número de argumentos.

  • Criar uma va_listvariável de tipo na definição da função. Este tipo é definido no arquivo de cabeçalho stdarg.h.

  • Usar int parâmetro e va_start macro para inicializar o va_listvariável para uma lista de argumentos. A macro va_start é definida no arquivo de cabeçalho stdarg.h.

  • Usar va_arg macro e va_list variável para acessar cada item na lista de argumentos.

  • Use uma macro va_end para limpar a memória atribuída a va_list variável.

Agora vamos seguir as etapas acima e escrever uma função simples que pode pegar o número variável de parâmetros e retornar sua média -

#include <stdio.h>
#include <stdarg.h>

double average(int num,...) {

   va_list valist;
   double sum = 0.0;
   int i;

   /* initialize valist for num number of arguments */
   va_start(valist, num);

   /* access all the arguments assigned to valist */
   for (i = 0; i < num; i++) {
      sum += va_arg(valist, int);
   }
	
   /* clean memory reserved for valist */
   va_end(valist);

   return sum/num;
}

int main() {
   printf("Average of 2, 3, 4, 5 = %f\n", average(4, 2,3,4,5));
   printf("Average of 5, 10, 15 = %f\n", average(3, 5,10,15));
}

Quando o código acima é compilado e executado, ele produz o seguinte resultado. Deve-se notar que a funçãoaverage()foi chamado duas vezes e, a cada vez, o primeiro argumento representa o número total de argumentos variáveis ​​que estão sendo passados. Apenas reticências serão usadas para passar um número variável de argumentos.

Average of 2, 3, 4, 5 = 3.500000
Average of 5, 10, 15 = 10.000000