Variadic Fonksiyon

Variadic Fonksiyon konusuna değinilen kısım.

Variadic Fonksiyon Nedir?

Bir fonksiyonun sınırsız şekilde argüman alması istenirse bu konuda variadic fonksiyon bu duruma çözüm sunabilir.

#include <stdio.h>
#include <stdarg.h> // variadic yapılar için gerekli kitaplık

int sum(int count, ...) 
{
  int sum = 0;
  va_list ap;
  va_start(ap, count);
  for (int i = 0; i < count; i++)
    sum += va_arg(ap, int);
  va_end(ap);
  return sum;
}

int main()
{
  int result = sum(3, 1, 2, 3);
  printf("%d\n", result);
  return 0;
}

... ifadesinden önce mutlaka bağımsız bir parametreye (değişkene) ihtiyaç duyulur. Bu parametre girilecek olan argüman sayısı olabilir. Veya birden fazla bağımsız parametre de oluşturulabilir.

#include <stdio.h>
#include <stdarg.h> // variadic yapılar için gerekli kitaplık

int sum(int add, int c, ...) 
{
  int sum = 0;
  va_list ap;
  va_start(ap, c);
  for (int i = 0; i < c; i++)
    sum += va_arg(ap, int);
  va_end(ap);
  return sum + add;
}

int main()
{
  int result = sum(99, 3, 1, 2, 3);
  printf("%d\n", result);
  return 0;
}

C dilinde, variadic fonksiyonları işlemek için va_... yapıları kullanılır bu yapılara <stdarg.h> kitaplığı ile erişilebilir;

va_list:

  • va_list değişken sayıda argümanları saklamak için kullanılan bir veri türüdür.

  • Genellikle bir fonksiyonun içinde, değişken sayıda argümanları bu veri türü ile tutarsınız.

va_start:

  • va_start işlevi, va_list ile tutulan argüman listesini başlatır ve ilgili fonksiyona gönderilen ilk argümanın adresini belirtir.

va_arg:

  • va_arg işlevi, va_list ile tutulan argüman listesinden bir sonraki argümanı alır ve belirtilen türde bir değere dönüştürür.

  • Her va_arg çağrısı, argüman listesinde bir sonraki argümana geçer.

  • va_arg işleminin ikinci parametresi, va_list ile tutulan argüman listesinden alınacak argümanın veri türünü belirtir. Yani bu parametre, va_arg işleminin argümanın hangi türde olduğunu bilmesi için kullanılır.

va_end:

  • va_end işlevi, va_list ile tutulan argüman listesini işlemenin sonlandığını bildirir.

Last updated