Museum

Home

Lab Overview

Retrotechnology Articles

⇒ Online Manual

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

vprintf(3S)

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

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026