stdarg.h - Argumente bei variadischen Funktionen

In den Sprachen C und C++ ist es möglich, bei der Parameterliste einer Funktion mit mindestens einem Parameter mittels dreier Auslassungspunkte ... die genaue Anzahl an zusätzlich erwarteten Argumenten sowie deren Typ offenzulassen. Solchen als variadisch bezeichneten Funktionen können somit je nach Situation mehr oder weniger beliebige Argumente übergeben werden, ohne dass für jeden denkbar möglichen Fall eine neue Signatur ausprogrammiert werden muss. Um die übergebenen Argumente auszulesen, wird die stdarg-Bibliothek benötigt.

C
C++
#include <stdarg.h>
#include <cstdarg>

Definitionen in der Bibliothek

Die Verwendung von variadischen Funktionen gehört zum Sprachumfang von C und C++, jedoch existieren keine speziellen Keywords oder anderweitige syntaktische Elemente, um die zusätzlichen Argumente direkt anzusprechen. Durch Einbinden der stdarg-Bibliothek stehen jedoch einige wenige Makros zur Verfügung, welche das Ansprechen der Argumente ermöglichen. Auch wird in dieser Bibliothek ein Typ definiert für eine Argumentenliste:

List Type
va_list

Dieser Typ speichert einen Zeiger auf eines der zusätzlichen Argumente. Nachdem eine Variable mit diesem Typ definiert wurde, muss sie auf den letzten fixen Parameter vor den Auslassungspunkten ... initialisiert werden. Dies geschieht durch Aufruf des va_start-Makros:

Initialize List
va_start(argumentlist, lastfixedparameter)

Nach der Initialisierung kann nun jedes zusätzliche Argument durch eine wiederholte Anwendung des va_arg-Makros einzeln ausgelesen werden. Nach jeder Anwendung zeigt die Argumentenlisten-Variable automatisch auf das nächste Argument. Damit dies möglich ist, benötigt das Makro zusätzlich einen Typ, um die Grösse der Variablen zu bestimmen.

Get Argument
va_arg(argumentlist, typeofargument)

Nachdem alle gewünschten Parameter ausgelesen wurden, muss die Argumentenlisten-Variable aufgehoben werden. Dies wird mittels des va_end-Makros erreicht:

Destroy List
va_end(argumentlist)

Für einfache Abarbeitungen der Argumentenliste genügen die obigen Makros vollauf. Wenn die Argumentenliste jedoch mehrmals abgearbeitet werden muss oder aber die gesamte Argumentenliste an eine weitere Funktion übergeben werden soll, so wird zusätzlich noch das va_copy-Makro benötigt, welches die Argumentenlisten-Variable dupliziert:

Duplicate List
va_copy(destinationlist, sourcelist)

Da es sich bei dieser Bibliothek nicht um eine Funktionssammlung, sondern um einen Teil der Sprache C und C++ handelt, soll hier auf dieser Seite diese Auflistung der definierten Makros und des Typs genügen. Für eine detailierte Beschreibung über die Anwendung von variadischen Funktionen sowie von einigen dazugehörigen Problemen wird auf die Seite über den Funktions-Parameter ... verwiesen.