|
Uyumluluk Bilgisi: | |
---|---|
Birçok eski C gerçeklemesi, stdarg.h kullanılarak değişken sayıda argümanla işlevleri tanımlama mekanizmasına benzeyen ama uyumlu olmayan bir mekanizma sağlar. |
int func (const char *a, int b, …) { … }
Uyumluluk Bilgisi: | |
---|---|
Bazı C derleyicileri için son gerekli argümanın işlev tanımında register olarak bildirilmemesi gereklidir. Bundan başka, bu argümanın türü kendinden terfili olmalıdır: Şöyleki, öntanımlı terfiler onun türünü değiştirmemelidir. Bu kurallar dizi ve işlev türleri ile float, char (signed ya da değil) ve short int (signed ya da değil) türleri dışarda tutar. Bu aslında bir ISO C gerekliliğidir. |
Taşınabilirlik Bilgisi: | |
---|---|
Bazı derleyicilerle, bir argüman gösterici değerini bir alt işleve aktardıktan sonra, alt işlev döndüğünde aynı argüman gösterici değerini kullanımda tutmamalısınız. Tam taşınabilirlik için, onu va_end'e aktarmalısınız. Bu aslında bir ISO C gerekliliği olmakla birlikte birçok ANSI C derleyicisi ile de sorunsuz çalışır. |
va_list |
void va_start | (va_list arglist-gstr, gerekli-son-arg) |
tür va_arg | (va_list arglist-gstr, tür) |
void va_end | (va_list arglist-gstr) |
void __va_copy | (va_list hedef, va_list kaynak) |
{ va_list ap, save; … #ifdef __va_copy __va_copy (save, ap); #else save = ap; #endif … }
#include <stdarg.h> #include <stdio.h> int topla (int miktar,...) { va_list ag; int i, toplam; va_start (ag, miktar); /* Argüman listesi ilklendiriliyor. */ toplam = 0; for (i = 0; i < miktar; i++) toplam += va_arg (ag, int); /* Sonraki argümanın değeri alınıyor. */ va_end (ag); /* Temizlik. */ return toplam; } int main (void) { /* Bu çağrı 16 basar. */ printf ("%d\n", topla (3, 5, 5, 6)); /* Bu çağrı 55 basar. */ printf ("%d\n", topla (10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)); return 0; }
tree build (va_alist) va_dcl {
va_list p; va_start (p);
va_alist |
va_dcl |
void va_start | (va_list arglist-gstr) |
|