varargs(5) varargs(5)
NAME
varargs - Variable Argumentenlisten bearbeiten
SYNTAX
#include <varargs.h>
vaalist
vadcl
valist pvar;
void vastart(valist pvar);
type vaarg(valist pvar, type);
void vaend(valist pvar);
BESCHREIBUNG
Dieser Satz von Makros ermöglicht das Schreiben portabler Prozeduren,
die variable Argumentenlisten akzeptieren. Funktionen, die variable
Argumentenlisten aufweisen [wie z. B. printf(3S)], jedoch varargs.h
nicht verwenden, sind von Natur aus nicht portabel, da verschiedene
Maschinen verschiedene Methoden zum Weitergeben von Argumenten verwen-
den.
Die folgenden Datentypen werden in varargs.h definiert:
vaalist wird als Parameterliste in einem Funktionskopf verwendet.
vadcl ist eine Deklaration für vaalist Auf vadcl darf kein
Semikolon folgen.
valist ist ein Typ, der für die Variable definiert ist, die zum
Durchlaufen der Liste verwendet wird.
Folgende Makros sind in varargs.h enthalten:
vastart() wird zum Initialisieren von pvar auf den Anfang der Liste
aufgerufen.
vaarg() gibt das nächste Argument in der Liste zurück, auf das
pvar weist. type ist der Typ, den das Argument darstellen
soll. Verschiedene Typen können gemischt werden, doch ist
es dann der Funktion überlassen zu wissen, welcher Argu-
menttyp erwartet wird, da dies nicht zur Laufzeit ermit-
telt werden kann.
vaend() wird zum abschließenden Aufräumen verwendet.
Mehrfache Durchgänge sind möglich, wobei jeder Durchgang mit
vastart() und vaend() umschlossen ist.
Seite 1 Reliant UNIX 5.44 Gedruckt 11/98
varargs(5) varargs(5)
BEISPIELE
Dieses Beispiel zeigt eine mögliche Realisierung von execl [siehe
exec(2)].
#include <unistd.h>
#include <varargs.h>
#define MAXARGS 100
/* execl wird aufgerufen mit execl(file, arg1, arg2, ..., (char *)0); */
execl(vaalist)
vadcl
{
valist ap;
char *file;
char *args[MAXARGS]; /* angenommen, es ist groß genug */
int argno = 0;
vastart(ap);
file = vaarg(ap, char *);
while ((args[argno++] = vaarg(ap, char *)) != 0);
vaend(ap);
return execv(file, args);
}
HINWEISE
Die Angabe der Anzahl der vorliegenden Argumente ist Aufgabe der auf-
rufenden Funktion, da die Bestimmung der Anzahl der Argumente nicht
immer vom Stapelrahmen des Laufzeitkellers aus möglich ist. So wird
beispielsweise ein Nullzeiger zum Signalisieren des Endes der Liste an
execl() weitergegeben. printf() kann anhand des Formats feststellen,
wieviele Argumente vorliegen.
Die Angabe eines zweiten Arguments vom Typ char, short oder float für
vaarg() ist nicht portabel, da die von der aufgerufenen Funktion
gesehenen Argumente nicht char, short oder float sind. C wandelt char-
und short-Argumente in int- und float-Argumente in double um, bevor
diese an eine Funktion übergeben werden.
varargs.h wird aus Gründen der Kompatibilität zu vorhergehenden Ver-
sionen zur Verfügung gestellt. Verwenden Sie lieber stdarg.h.
SIEHE AUCH
exec(2), printf(3S), vprintf(3S), stdarg(5).
Seite 2 Reliant UNIX 5.44 Gedruckt 11/98