In diesem Kapitel lernen Sie Möglichkeiten kennen, wie Sie Funktionen mit einer variablen Anzahl von Argumenten aufrufen können.
18 Arbeiten mit variabel langen Argumentlisten – <stdarg.h>
Dass in C Funktionen mit variabel langen Argumentlisten aufgerufen werden können, dürfte Ihnen an Funktionen wie printf() oder scanf() bereits aufgefallen sein. Die Deklaration von printf() sieht wie folgt aus:
int printf(const char* format, ...);
Anhand dieser Deklaration erkennen Sie auch, dass printf() mindestens ein festes Argument (const char *format) und eine variable Anzahl optionaler Argumente erwartet. Die variable Anzahl optionaler Argumente erkennen Sie an den drei Punkten, dem zweiten Parameter von printf(). Diese drei Punkte werden Ellipse genannt. Die Verwendung von printf() ohne weitere Argumente kennen Sie ja:
printf("ohne weitere Argumente\n");
Jetzt folgt dasselbe mit zwei Argumenten:
printf("Ich habe %d %s\n", argument2, argument1);
Anhand der beiden Formatzeichen %d und %s ist jetzt bekannt, dass dort zwei Argumente folgen.
18.1 Makros in <stdarg.h> – »va_list«, »va_arg«, »va_start« und »va_end«
Damit Sie eigene Funktionen mit einer variablen Argumentliste schreiben können, sind in der Headerdatei <stdarg.h> folgende vier Makros deklariert:
Makro | Syntax | Bedeutung |
va_list |
va_list argPtr; |
Abstrakter Datentyp (wird auch als Argumentzeiger bezeichnet), mit dem die Liste der Parameter definiert wird und mit dem der Zugriff auf die optionalen Argumente realisiert wird. |
va_start |
va_start( va_list argPtr, lastarg); |
Argumentliste initialisiert den Argumentzeiger argPtr mit der Position des ersten optionalen Arguments. An lastarg muss der letzte Parameter in der Liste übergeben werden. |
va_arg |
type va_arg( va_list argPtr, typ ); |
Gibt das optionale Argument zurück, auf das argPtr im Augenblick verweist, und setzt den Argumentzeiger auf das nächste Argument. Mit typ geben Sie den Typ des zu lesenden Arguments an. |
va_end |
void va_end(va_list argPtr); |
Hiermit können Sie den Argumentzeiger argPtr beenden, wenn Sie diesen nicht mehr benötigen. |
va_copy |
void va_copy( va_list dest, va_list src ) ; |
Hiermit initialisieren Sie den Argumentzeiger dest mit den aktuellen Argumenten von src. Dies macht beispielsweise dann Sinn, wenn Sie eine Argumentenliste ein zweites Mal durchlaufen wollen. |
Hinweis |
Die Makros va_end() und va_copy() können auch als Funktion implementiert sein. |
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.