Provided by:
manpages-pl-dev_20060617-3_all 
NAZWA
stdarg - listy zmiennych argumentow
SK/LADNIA
#include <stdarg.h>
void va_start(va_list ap, last);
type va_arg(va_list ap, type);
void va_end(va_list ap);
void va_copy(va_list dest, va_list src);
OPIS
Funkcj mona wola z ron liczb argumentow, ronych typow. Plik naglowkowy
stdarg.h deklaruje typ va_list i definiuje trzy makra, iterujce poprzez
list argumentow, ktorych liczba i typy nie s znane wywolanej funkcji.
Wywolana funkcja musi zadeklarowa obiekt typu va_list, ktory jest
uywany przez makra va_start, va_arg i va_end.
va_start
Makro va_start inicjuje ap do dalszego uytku przez va_arg i va_end, i
musi by wywolane jako pierwsze.
Parametr last jest nazw ostatniego parametru przed zmienn list
argumentow, czyli ostatnim parametrem, ktorego typ byl funkcji znany.
Poniewa adres tego parametru jest uywany w makrze va_start, nie
powinien on by deklarowany jako zmienna rejestrowa, funkcja czy typ
tablicowy.
va_arg
Makro va_arg rozwija si do wyraenia, ktore ma typ i warto nastpnego
argumentu w wywolaniu. Parametr ap to va_list ap zainicjowany przez
va_start. Kade wywolanie va_arg zmienia ap tak, e nastpne wywolanie
zwraca nastpny argument. Parametr type Jest nazw typu, podan tak e typ
wskanika do obiektu, ktory ma podany typ mona uzyska przez dodanie * do
type.
Pierwsze uycie makra va_arg po va_start zwraca argument za
last(ostatnim). Kolejne wywolania zwracaj wartoci pozostalych
argumentow.
Jeli nie ma nastpnego argumentu lub jeli type nie jest zgodny z
rzeczywistym typem nastpnego argumentu, pojawi si losowe bldy.
Jeli ap zostanie przekazane do funkcji uywajcej va_arg(ap,type), to
warto ap po zakoczeniu tej funkcji bdzie nieokrelona.
va_end
Kademu wywolaniu va_start musi odpowiada wywolanie va_end w obrbie tej
samej funkcji. Po wywolaniu va_end(ap) warto ap bdzie nieokrelona.
Lista moe by przetwarzana wielokrotnie, przy czym kade przetworzenie
musi by zawarte pomidzy va_start a va_end. va_end moe by zarowno
makrem, jak i funkcj.
va_copy
Oczywista implementacja zawieralaby wskanik va_list do ramki stosu
funkcji o zmiennej liczbie argumentow. Przy takiej konfiguracji (jak
dotd, najpowszechniejszej) nie ma adnych przeciwskaza wobec
podstawienia
va_list aq = ap;
Niestety, s rownie systemy, ktore robi to poprzez tablic wskanikow (o
dlugoci 1) i wtedy niezbdne jest
va_list aq;
*aq = *ap;
Wreszcie, w systemach, ktore przekazuj parametry w rejestrach, moe
okaza si koniecznym przydzielenie pamici przez va_start, przechowanie
tam parametrow, jak te wskaza, ktory parametr jest nastpny, tak aby
va_arg moglo przej cal list. Wowczas va_end moe wreszcie zwolni
przydzielon w tym celu pami. Aby dostosowa si do tej sytuacji, C99
dodaje makro va_copy, tak aby powysze przypisanie moglo byc zastpione
przez
va_list aq;
va_copy(aq, ap);
...
va_end(aq);
Kademu wywolaniu va_copy musi odpowiada wywolanie va_end w obrbie tej
samej funkcji. Niektore systemy nie udostpniajce va_copy posiadaj
zamiast tego __va_copy, gdy ta nazwa byla uywana w szkicowej propozycji
standardu.
PRZYK/LADY
Funkcja foo pobiera lacuch znakow formatujcych i wypisuje argumenty z
nimi zwizane w oparciu o typ argumentu.
#include <stdio.h>
#include <stdarg.h>
void foo(char *fmt, ...) {
va_list ap;
int d;
char c, *p, *s;
va_start(ap, fmt);
while (*fmt)
switch(*fmt++) {
case 's': /* napis */
s = va_arg(ap, char *);
printf("string %s\n", s);
break;
case 'd': /* int */
d = va_arg(ap, int);
printf("int %d\n", d);
break;
case 'c': /* char */
/* wystpuje tu potrzeba rzutowania, gdy va_arg
pobiera w pelni awansowane typy */
c = (char) va_arg(ap, int);
printf("char %c\n", c);
break;
}
va_end(ap);
}
ZGODNE Z
Makra va_start, va_arg, i va_end s zgodne z ANSI X3.159-1989 (``C89'').
C99 definiuje makro va_copy.
KOMPATYBILNO
Makra te nie s zgodne z historycznymi makrami, ktore zastpily. Zgodna
wstecznie wersja znajduje si w pliku naglowkowym varargs.h.
POR'OWNANIE
Historyczna konfiguracja to:
#include <varargs.h>
void foo(va_alist) va_dcl {
va_list ap;
va_start(ap);
while(...) {
...
x = va_arg(ap, type);
...
}
va_end(ap);
}
W niektorych systemach, va_end zawiera zamykajcy '}' odpowiadajcy '{' w
va_start, tak eby obydwa makra musialy wystpi w tej samej funkcji w
dozwolony sposob.
USTERKI
W przeciwiestwie do makr varargs, makra stdarg nie zezwalaj
programistom na tworzenie funkcji bez ustalonych argumentow. Problem
ten powoduje utrudnienia podczas konwersji kodu varargs na kod stdarg,
a take utrudnia tworzenie funkcji, ktore maj za zadanie jedynie
przekaza wszystkie swoje argumenty do funkcji pobierajcej argument
va_list, takiej jak vfprintf(3).
INFORMACJE O T/LUMACZENIU
Powysze tlumaczenie pochodzi z nieistniejcego ju Projektu Tlumaczenia
Manuali i moe nie by aktualne. W razie zauwaenia ronic midzy powyszym
opisem a rzeczywistym zachowaniem opisywanego programu lub funkcji,
prosimy o zapoznanie si z oryginaln (angielsk) wersj strony podrcznika.
2001-10-14 STDARG(3)