Stdarg.h
Wygląd
Deklaracja
[edytuj]va_list nazwa;
va_start( va_list lista, parmN);
va_copy( va_list kopia, va_list lista);
va_arg( va_list lista, typ danych);
va_end( va_lista);
Pliku nagłówkowy
[edytuj]Opis
[edytuj]parmN
argument funkcji stojący przed wielokropkiem, pozwala on uzyskać adres listy argumentów.
- Typ
va_list
reprezentuje obiekt danych używany do przechowywania argumentów odpowiadających liście argumentów, które wypisujemy w miejsce wielokropka.
- Makro
va_start( va_list, parmN)
kopiuje listę argumentów do zmiennej typu va_list.
- Makro
va_arg( va_list, typ danych)
przyjmuje dwa argumenty zmienną typu va_list oraz nazwę typu pobieranych danych. Każdorazowe wywołanie makra va_arg skutkuje zwróceniem przez nie kolejnego argumentu z listy va_list.
- Makro
va_end( va_lista)
zwalnia przydzielone zasoby.
- Makro
va_copy( va_list, va_list)
pozwala utworzyć kopię va_list. Jest to przydatna opcja kiedy chcemy kilka razy analizować argumenty funkcji, gdyż mechanizm va_arg() nie ma możliwości powrotu do poprzedniego elementu. Należy pamiętać o zwolnieniu przydzielonych zasobów kopi.
Przykład użycia
[edytuj]#include <stdio.h>
#include <stdarg.h>
void display_sum( int N, ...) // N jest naszym argumentem parmN
{
va_list lista, kopia; // deklaracja zmiennych typu va_list przechowujących listę argumentów
va_start( lista, N); // skopiowanie listy argumentów do zmiennej lista
va_copy( kopia, lista); // tworzenie kopi listy
int sum = 0;
for( int i = 0; i < N; i++)
sum += va_arg( lista, int); // pobieranie i sumowanie kolejnych argumentów z listy
for( int i = 0; i < N - 1; i++)
printf( "%d + ", va_arg( kopia, int)); // pobieranie i wyświetlanie kolejnych argumentów kopi listy
printf( "%d = ", va_arg( kopia, int));
printf( "%d", sum);
va_end( lista); // zwalnianie zasobów listy
va_end( kopia); // zwalnianie zasobów kopi
return;
}
int main()
{
display_sum( 5, 1, 2, 4, 7, 3);
return 0;
}
// Odpowiedź programu: 1 + 2 + 4 + 7 + 3 = 17