Provided by: manpages-pl-dev_20060617-3_all bug

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)