Funkcje o nieokreślonej liczbie argumentów
Język C/C++ dopuszcza tworzenie funkcji o nieokreślonej liczbie argumentów. Wprawdzie w C++ potrzeba używania takich funkcji jest znacznie ograniczona poprzez możliwość przesyłania do funkcji obiektów strukturalnych, jednak w czystym C było to i jest nadal ważnym mechanizmem tworzenia elastycznych funkcji.
Funkcja o nieokreślonej liczbie argumentów może przyjmować pewną stałą listę argumentów. Te opcjonalne umieszczane są na końcu i oznaczamy wielokropkiem, na przykład
int funkcja(int a, float b, char* typ,...);
Taki zapis oznacza, że funkcja zawsze oczekuje co najmniej trzech argumentów, które są kolejno typów int, float, char*. Później może wystąpić cokolwiek.
Aby skorzystać z mechanizmu przesyłania nieokreślonej ilości argumentów do funkcji należy dołączyć plik nagłówkowy cstdarg lub stdarg.h. Później schemat postępowania jest następujący
-
W pliku nagłówkowym cstdarg jest zdefiniowany typ va_list (nazwa pochodzi od variable-arguments list). Należy utworzyć zmienną tego typu. Załóżmy, że zmienna ta nazywa się ap (jest to tradycyjna nazwa takiej zmiennej, od argument pointer).
- Wywołujemy funkcję biblioteczną va_start podając jako jej pierwszy argument utworzoną wcześniej zmienną typu va_list, a jako drugi argument zmienną odpowiadającą ostatniemu parametrowi obowiązkowemu definiowanej funkcji. Po deklaracji z ostatniego przykładu wywołanie miałoby zatem postać
-
Wartości kolejnych argumentów odczytujemy wywołując funkcję va_arg: pierwszym jej argumentem powinna być zmienna ap, a drugim nazwa typu wartości odpowiedniego tego argumentu funkcji który chcemy odczytać.
double z = va_arg(ap,double);
Wynika z tego, że te typy trzeba znać! Trzeba też wiedzieć, kiedy skończyć wczytywanie argumentów. Najczęściej informacja o ich liczbie i typie przekazywana jest w jakiejś formie w pierwszych, obowiązkowych, argumentach funkcji.
-
Wywołujemy funkcję va_end ze zmienną ap jako jedynym argumentem. Funkcja ta porządkuje stos, tak, aby powrócił on do stanu sprzed wywołania.
Przykład - zmienna liczba argumentów.