STDARG(3) Bibliotheksfunktionen STDARG(3)
stdarg - variable Argument-Listen
#include <stdarg.h>
void va_start( va_list ap, last);
type va_arg( va_list ap, type);
void va_end( va_list ap);
Eine Funktion darf mit einer veränderlchen Anzahl von Argumenten
veränderlichen Typs aufgerufen werden. Die Include-Datei stdarg.h
deklariert einen Typ va_list und definiert drei Makros, um eine Liste
vor Argumenten durchzugehen, deren Anzahl und Typen der aufgerufenen
Funktion unbekannt sind.
Die aufgerufene Funktion muss ein Objekt des Typs va_list deklarieren,
welches von den Makros va_start, va_arg, und va_end benutzt wird.
Das Makro va_start initialisiert ap für spätere Benutzung durch va_arg
und va_end, und muss zuerst aufgerufen werden.
Der Parameter last ist der Name des letzten Parameters vor der Liste
der veränderlichen Argumente, d.h. der letzte Parameter, dessen Typ die
aufrufende Funktion kennt.
Da die Adresse dieses Parameters in dem Makro va_start benutzt wird
sollte er nicht als eine Registervariable, als Funktion oder Array-Typ
deklariert sein.
Das Makro va_start liefert keinen Wert zurück.
Das Makro va_arg expandiert zu einem Ausdruck, der den Typ und Wert des
nächsten aufzurufenden Argumentes hat. Der Parameter ap ist va_list ap
initialisiert durch va_start. Jeder Aufruf von va_arg verändert ap so
dass der nächste Aufruf das nächste Argument zurückliefert. Der Param‐
eter type ist ein Typenname, der so angegeben ist, dass der Typ eines
Pointers auf ein Objekt, das den angegebenen Typ hat, durch Hinzufügen
eines * zu type erhalten werden kann.
Wenn es kein weiteres Argument gibt, oder wenn type nicht kompatibel
mit dem Typ des nächsten Argumentes ist, erscheinen zufällige Fehler.
Die erste Benutzung des Makros va_arg nach va_start liefert das Argu‐
ment nach last zurück. Folgende Aufrufe geben die Werte der
verbleibenden Argumente zurück.
Das Makro va_end ermöglicht eine normale Rückkehr aus der Funktion
dessen variable Argumentliste durch va_start initialisiert wurde.
Das Makro va_end liefert keinen Wert zurück.
Die Funktion foo nimmt einem String von Format-Zeichen und gibt das
Argument aus, das mit jedem Format-Zeichen in Zusammenhang gebracht
wird, basierend auf dem Typ.
void foo(char *fmt, ...)
{
va_list ap;
int d;
char c, *p, *s;
va_start(ap, fmt);
while (*fmt)
switch(*fmt++) {
case ’s’: /* string */
s = va_arg(ap, char *);
printf("string %s\n", s);
break;
case ’d’: /* int */
d = va_arg(ap, int);
printf("int %d\n", d);
break;
case ’c’: /* char */
c = va_arg(ap, char);
printf("char %c\n", c);
break;
}
va_end(ap);
}
Die Makros va_start, va_arg, und va_end sind konform zu ANSI
C3.159-1989 (‘‘ANSI C’’).
Diese Makros sind not kompatibel mit den historischen Makros, die sie
ersetzen. Eine abwärtskompatible Version kann in der Includedatei
varargs.h gefunden werden.
Im Gegensatz zu den Makros varargs erlauben die Makros stdarg dem Pro‐
grammierer nicht, eine Funktion ohne feste Argumente zu implementieren.
Dieses Problem macht hauptsächlich Arbeit wenn man Code mit varargs
nach stdarg konvertiert, aber es erzeugt auch Schwierigkeiten bei
veränderlichen Funktionen die wünschen, ihre Argumente an eine Funktion
weiterzugeben, die ein Argument va_list nimmt, wie vfprintf(3).
BSD 23. Juni 1996 STDARG(3)