C
stdarg.h
stdarg.h ile değişken argümanlı fonksiyon öğrenirsin.
stdarg.h
C'de bazı fonksiyonlar değişken sayıda argüman alabilir: printf gibi. <stdarg.h> başlığı bu işi kolaylaştıran araçları sunar.
Dört temel parça vardır: va_list (argüman listesi tipi), va_start(liste, son_sabit) (listeyi başlatır), va_arg(liste, tip) (bir sonraki argümanı okur), va_end(liste) (listeyi kapatır). Önemli nokta: fonksiyon kaç argüman alacağını bir şekilde bilmelidir. printf bunu format dizesinden çıkarır; sum_n gibi bir fonksiyon ise ilk argüman olarak sayımı alır. ... imza sonundaki üç nokta, değişken argümanların geldiğini belirtir.
sum_n örneği
Değişken argümanlı bir fonksiyon yazalım: int sum_n(int count, ...). İlk parametre count kaç sayı toplanacağını söyler; ... ise toplanacak sayıları ifade eder.
Tanım: va_list args; va_start(args, count); int total = 0; for (int i = 0; i < count; i++) total += va_arg(args, int); va_end(args); return total;. va_start'ın ikinci parametresi, son sabit (fixed) parametredir; burada count. Bu, derleyiciye argümanların bellekte nereden başladığını söyler. va_arg her çağrıda bir sonraki argümana geçer ve verilen tiple okur. Döngü bitince va_end ile liste kapatılır. Çağrı: sum_n(3, 10, 20, 30) → 60.
Uygulama sum_n fonksiyonu
int sum_n(int count, ...) yaz. İçinde va_list args;, va_start(args, count);, bir for döngüsünde total += va_arg(args, int);, döngü sonunda va_end(args);, return total;. main'de printf("%d\n", sum_n(3, 10, 20, 30)); çağır.
Örnek çözümü göster
#include <stdio.h>
#include <stdarg.h>
int sum_n(int count, ...) {
va_list args;
va_start(args, count);
int total = 0;
for (int i = 0; i < count; i++) {
total += va_arg(args, int);
}
va_end(args);
return total;
}
int main(void) {
printf("%d\n", sum_n(3, 10, 20, 30));
return 0;
}
Kendini test et
-
va_arg ne işe yarar?
- bir sonraki argümanı okur
- listeyi başlatır
- listeyi kapatır
- argüman sayısını döndürür
Cevabı göster
bir sonraki argümanı okur — va_arg(liste, tip) bir sonraki argümanı okur.
-
stdarg makroları
- va_list
- argüman listesi tipi
- va_start
- listeyi başlat
- va_arg
- sonrakını oku
- va_end
- listeyi kapat
-
va_start çağrısı
va_start(args, ____);
Cevabı göster
va_start(args, count);
Sıradaki ders: va_start ve va_end