C
va_start ve va_end
va_start, va_arg ve va_end makrolarını öğrenirsin.
va_start ve va_end yaşam döngüsü
va_start ve va_end bir çifttir: va_start ile başlatılan liste mutlaka va_end ile kapatılmalıdır. Bu, taşınabilirlik ve kaynak temizliği için gerekliidir.
va_start(args, count) çağrısı, args listesini count parametresinden sonraki argümana konumlandırır. Bundan sonra her va_arg çağrısı bir argümanı okur ve konumu ilerletir. Tüm okumalar bitince va_end(args) çağrılır. Bu, bazı platformlarda kaynak temizliği yapar; atlanırsa tanımsız davranış oluşabilir. Bu nedenle va_start gören her fonksiyonda va_end de olmalıdır. Basit bir ilke: her va_start'a bir va_end.
print_numbers örneği
va_arg'ı doğrudan printf içinde kullanabiliriz. Bu, ara değişken olmadan değerleri yazdırır.
Tanım: void print_numbers(int count, ...) { va_list args; va_start(args, count); for (int i = 0; i < count; i++) printf("%d ", va_arg(args, int)); va_end(args); printf("\n"); }. Her döngü adımında va_arg(args, int) bir sonraki tamsayıyı okur ve printf onu yazdırır. Döngüden sonra va_end ile liste kapatılır, sonra yeni satır yazdırılır. Çağrı print_numbers(3, 10, 20, 30) çıktısı 10 20 30 ve yeni satır olur. Boşluk formatında her sayıdan sonra boşluk bırakmak, çıktıyı düzenli tutar.
Uygulama print_numbers fonksiyonu
void print_numbers(int count, ...) yaz. va_list args; va_start(args, count); ile başla. for (int i = 0; i < count; i++) döngüsünde printf("%d ", va_arg(args, int)); çağır. Döngü sonunda va_end(args); ve printf("\n");. main'de print_numbers(3, 10, 20, 30); çağır.
Örnek çözümü göster
#include <stdio.h>
#include <stdarg.h>
void print_numbers(int count, ...) {
va_list args;
va_start(args, count);
for (int i = 0; i < count; i++) {
printf("%d ", va_arg(args, int));
}
va_end(args);
printf("\n");
}
int main(void) {
print_numbers(3, 10, 20, 30);
return 0;
}
Kendini test et
-
Listeyi kapat
va_____(args);
Cevabı göster
va_end(args);
-
va_start çağrılmadan va_arg kullanılırsa ne olur?
- derleme hatası
- tanımsız davranış
- sıfır döner
- bir önceki argüman okunur
Cevabı göster
tanımsız davranış — va_start'sız va_arg tanımsızdır; çoğu durumda çöker veya çöp okur.
-
va_ araçları
- va_list
- tip tanımı
- va_start
- konumu hazırla
- va_arg
- değeri oku
- va_end
- kaynağı temizle
Sıradaki ders: printf gibi fonksiyon