stdarg(5) stdarg(5)
NAME
stdarg - Variable Argumentenliste bearbeiten
SYNTAX
#include <stdarg.h>
valist pvar;
void vastart(valist pvar, parmN);
type vaarg(valist pvar, type);
void vaend(valist pvar);
BESCHREIBUNG
stdarg.h enthält Makros, die die Entwicklung von portablen Prozeduren
erlauben, welche eine variable Anzahl von Argumenten verschiedener
Typen akzeptieren. Routinen mit variablen Argumentenlisten (wie
printf()), die diese Makros nicht verwenden, sind nicht portabel, da
verschiedene Maschinen unterschiedliche Konventionen der Argumentüber-
gabe verwenden.
valist ist für Variablen definiert, die die Liste durchlaufen.
Das Makro vastart() wird vor dem Zugriff auf die namenlosen Argumente
ausgeführt und initialisiert pvar zum nachfolgenden Bearbeiten durch
vaarg() und vaend(). Der Parameter parmN ist der Bezeichner des
letzten Parameters in der variablen Parameterliste der Funktionsdefi-
nition. Wenn dieser Parameter deklariert wird mit der Speicherklasse
register, mit einem Funktions- oder Feldtyp, oder gar mit einem Typ,
der nicht mit dem Typ kompatibel ist, der nach der Anwendung der vor-
eingestellten Argumentbehandlung resultiert, ist das Ergebnis undefi-
niert.
Der Parameter parmN wird bei strenger ANSI-C-Übersetzung erfordert.
Unter anderen Übersetzungsmodi braucht parmN nicht angegeben zu wer-
den, und der zweite Parameter für das Makro vastart() kann ausgelas-
sen werden (z. B. vastart(pvar, );). Dies erlaubt Routinen, die keine
Parameter vor ... in der variablen Parameterliste akzeptieren.
Das Makro vaarg() wird als ein Ausdruck bewertet, der den Typ und den
Wert des nächsten Arguments des Aufrufs darstellt. Der Parameter pvar
sollte vorher durch vastart() initialisert werden. Jeder Aufruf von
vaarg() ändert pvar so, daß die Werte von nachfolgenden Argumenten
der Reihe nach zurückgeliefert werden. Der Parameter type ist der
Typname des nächsten zurückgelieferten Arguments. Der Typname muß so
angegeben sein, daß der Typ eines Zeigers auf ein Objekt dieses Typs
über Anhängen eines * an type erzeugt werden kann. Gibt es kein näch-
stes Argument oder ist type nicht kompatibel mit dem Typ des nächsten
Arguments (entsprechend der voreingestellten Argumentbehandlung), ist
das Verhalten undefiniert.
Das Makro vaend() wird zum Aufräumen verwendet.
Mehrfache Durchläufe, mit vastart() beginnend und vaend() endend,
Seite 1 Reliant UNIX 5.44 Gedruckt 11/98
stdarg(5) stdarg(5)
sind möglich.
BEISPIELE
Im folgenden Beispiel werden die Zeiger auf Zeichenketten über eine
variable Argumentenliste in ein Feld eingelesen. Dies geschieht über
die Funktion f1, welche allerdings nicht mehr als MAXARGS Argumente
akzeptiert. Danach wird das Feld als einzelnes Argument an die Funk-
tion f2 übergeben. Die Anzahl der Zeiger wird im ersten Argument von
f1 angegeben.
#include <stdarg.h>
#define MAXARGS 31
void f1(int nptrs, ...)
{
valist ap;
char *array[MAXARGS];
int ptrno = 0;
if (nptrs > MAXARGS)
nptrs = MAXARGS;
vastart(ap, nptrs);
while (ptrno < nptrs)
array[ptrno++] = vaarg(ap, char*);
vaend(ap);
f2(nptrs, array);
}
Bei jedem Aufruf von f1 sollte die Definition der Funktion oder eine
Deklaration wie
void f1(int, ...)
verfügbar sein.
HINWEISE
Es liegt bei der aufrufenden Routine, anzugeben, wieviele Argumente
übergeben werden, da die Festellung der Anzahl der Argumente aus dem
Stack nicht immer möglich ist. Beispielsweise wird execl() ein Null-
zeiger übergeben, um das Ende der Liste anzuzeigen. printf() erkennt
anhand des Formats die Anzahl der Argumente. Die Angabe eines zweiten
Arguments char, short oder float für vaarg() ist nicht portabel, da
die von der aufgerufenen Funktion sichtbaren Argumente nicht char,
short oder float sind. C konvertiert char- und short-Argumente in int
und wandelt float-Argumente in double um, bevor sie an eine Funktion
übergeben werden.
SIEHE AUCH
vprintf(3S).
Seite 2 Reliant UNIX 5.44 Gedruckt 11/98