STDARG(3) Podręcznik programisty Linuxa STDARG(3)
NAZWA
stdarg - listy zmiennych argumentów
SKŁADNIA
#include <stdarg.h>
void va_start( va_list ap, last);
type va_arg( va_list ap, type);
void va_end( va_list ap);
OPIS
Funkcję można wołać z różną liczbą argumentów, różnych
typów. Plik nagłówkowy stdarg.h deklaruje typ va_list i
definiuje trzy makra, iterujące poprzez listę argumentów,
których liczba i typy nie są znane wywołanej funkcji.
Wywołana funkcja musi zadeklarować obiekt typu va_list,
który jest używany przez makra va_start, va_arg i va_end.
Makro va_start inicjalizuje ap do dalszego użytku przez
va_arg i va_end, i musi być wywołane jako pierwsze.
Parametr last jest nazwą ostatniego parametru przed listą
argumentów, czyli ostatnim parametrem, którego typ był
funkcji znany.
Ponieważ adres tego parametru jest używany w makrze
va_start, nie powinien on być deklarowany jako zmienna
rejestrowa, funkcja czy typ tablicowy.
Makro va_start nie zwraca wartości.
Makro va_arg rozwija się do wyrażenia, które ma typ i
wartość następnego argumentu w wywołaniu. Parametr ap to
va_list ap zainicjalizowany przez va_start. Każde
wywołanie va_arg zmienia ap tak, że następne wywołanie
zwraca następny argument. Parametr type Jest nazwą typu,
podaną tak że typ wskaźnika do obiektu, który ma podany
typ można uzyskać przez dodanie * do type.
Jeśli nie ma następnego argumentu, lub jeśli type nie jest
kompatybilny z rzeczywistym typem następnego argumentu,
pojawią się losowe błędy.
Pierwsze użycie makra va_arg po va_start zwraca argument
za last(ostatnim). Kolejne wywołania zwracają wartości
pozostałych argumentów.
Makro va_end obsługuje normalny powrót z funkcji, której
lista argumentów została zainicjalizowana przez va_start.
Makro va_end nic nie zwraca.
BSD MANPAGE 29 Listopad 1993 1
STDARG(3) Podręcznik programisty Linuxa STDARG(3)
PRZYKŁADY
Funkcja foo pobiera łańcuch znaków formatowych i drukuje
argumenty z nimi związane.
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 */
c = va_arg(ap, char);
printf("char %c\n", c);
break;
}
va_end(ap);
}
STANDARDY
Makra va_start, va_arg, i va_end są zgodne z ANSI
C3.159-1989 (``ANSI C'').
KOMPATYBILNOŚĆ
Makra te nie są kompatybilne z historycznymi makrami, na
których są miejscu. Kompatybilna wstecznie wersja znajduje
się w pliku nagłówkowym varargs.h.
USTERKI
W przeciwieństwie do makr varargs, makra stdarg nie
zezwalają programistom na tworzenie funkcji bez ustalonych
argumentów. Problem ten powoduje utrudnienia podczas kon
wertowania kodu varargs na stdarg, a także utrudnia
tworzenie funkcji, które mają za zadanie jedynie przekazać
wszystkie swoje argumenty do funkcji, która pobiera argu
ment va_list, takiej jak vfprintf(3).
BSD MANPAGE 29 Listopad 1993 2
Wyszukiwarka
Podobne podstrony:
stdargwięcej podobnych podstron