stdarg 3






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:
stdarg

więcej podobnych podstron