Stdarg.h

Z Wikibooks, biblioteki wolnych podręczników.

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]

stdarg.h

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