va_arg, va_end, va_start

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Stdarg.h - Index


Header-Datei

stdarg.h

Kategorie

Routinen für variable Argumentlisten

Prototyp

void va_start(va_list ap, lastfix);

type va_arg(va_list ap, type);

void va_end(va_list ap);

Beschreibung

Implementiert eine variable Argumentliste.

Einige C-Funktionen, etwa vfprintf und vprintf, übernehmen neben festen (bekannten) Parametern auch variable Argumentlisten. Die Makros va_arg, va_end und va_start bieten eine portierbare Möglichkeit, auf diese Argumentlisten zuzugreifen. Sie werden dafür verwendet, eine Liste von Argumenten schrittweise durchzugehen, wenn die aufrufende Funktion die Anzahl und den Typ der übergebenen Argumente nicht kennt.

Die Header-Datei stdarg.h deklariert einen Typ (va_list) und drei Makros (va_start, va_arg und va_end).

  • va_list: Dieses Array speichert die von va_arg und va_end benötigten Informationen. Wenn eine aufgerufene Funktion eine variable Argumentliste übernimmt, deklariert sie die Variable ap des Typs va_list.
  • va_start: Diese Routine (als Makro implementiert) richtet einen Zeiger auf das erste Element der der Funktion übergebenen variablen Argumentliste ein. va_start muss vor dem ersten Aufruf von va_arg oder va_end verwendet werden.
  • va_start übernimmt zwei Parameter: ap und lastfix. (ap wurde unter va_list im vorigen Absatz erläutert; lastfix ist der Name des letzten festen Parameters, der der aufgerufenen Funktion übergeben wurde.)
  • va_arg: Diese Routine (ebenfalls als Makro implementiert) wird zu einem Ausdruck mit gleichem Typ und Wert wie das nächste übergebene Argument (eines der variablen Argumente) erweitert. Die Variable ap für va_arg sollte die Variable ap sein, die va_start initialisiert hat.

Hinweis: Wegen der Standarderweiterungen können Sie die Typen char, unsigned char oder float nicht zusammen mit va_arg verwenden.

Hinweis: Beim ersten Aufruf von va_arg wird das erste Argument der Liste zurückgegeben. Bei jedem weiteren Aufruf wird das nächste Argument der Liste zurückgegeben. Dazu wird ap zunächst dereferenziert und dann inkrementiert, so dass ap auf das folgende Element zeigt. va_arg verwendet den Typ sowohl für die Dereferenzierung als auch für die Lokalisierung des folgenden Elements. Bei jedem weiteren Aufruf von va_arg wird ap so geändert, dass ap auf das nächste Argument der Liste zeigt.

  • va_end: Dieses Makro hilft der aufrufenden Funktion, normal zurückzukehren. va_end kann ap so ändern, dass ap erst wieder verwendet werden kann, wenn va_start erneut aufgerufen wird. va_end sollte aufgerufen werden, nachdem va_arg alle Argumente gelesen hat; wird dies unterlassen, könnte ein seltsames, nicht definiertes Verhalten Ihres Programms die Folge sein.

Rückgabewert

va_start und va_end geben keine Werte zurück; va_arg gibt das aktuelle Argument der Liste zurück (dasjenige, auf das ap zeigt).

Beispiel

#include <stdio.h>
#include <stdarg.h>
/* calculate sum of a 0 terminated list */
void sum(char *msg, ...)
{
   int total = 0;
   va_list ap;
   int arg;
   va_start(ap, msg);
   while ((arg = va_arg(ap,int)) != 0) {
      total += arg;
   }
   printf(msg, total);
   va_end(ap);
}
int main(void) {
   sum("The total of 1+2+3+4 is %d\n", 1,2,3,4,0);
   return 0;
}

Portabilität

POSIX Win32 ANSI C ANSI C++

+

+

+

+

Siehe auch