Variadic arguments
Variadic-Funktionen sind Funktionen, die mit einer unterschiedlichen Anzahl von Argumenten aufgerufen werden können.
Nur prototypisierte Funktionsdeklarationen können variadisch sein. Dies wird durch den Parameter der Form ... angezeigt, der als letztes in der Parameterliste erscheinen muss und mindestens einem benannten Parameter folgen muss (bis C23) . Der Ellipsen-Parameter und der vorangehende Parameter müssen durch , getrennt werden.
// Prototypierte Deklaration int printx(const char* fmt, ...); // Funktion auf diese Weise deklariert printx("hello world"); // kann mit einem printx("a=%d b=%d", a, b); // oder mehr Argumenten aufgerufen werden int printz(...); // OK seit C23 und in C++ // Fehler bis C23: ... muss mindestens einem benannten Parameter folgen // int printy(..., const char* fmt); // Fehler: ... muss das letzte sein // int printa(const char* fmt...); // Fehler in C: ',' ist erforderlich; OK in C++
Beim Funktionsaufruf durchläuft jedes Argument, das Teil der variablen Argumentliste ist, spezielle implizite Konvertierungen, die als Default Argument Promotions bekannt sind.
Im Rumpf einer Funktion, die variadische Argumente verwendet, können die Werte dieser Argumente mithilfe der
<stdarg.h>
Bibliotheksfunktionen
abgerufen werden:
|
Definiert im Header
<stdarg.h>
|
|
|
ermöglicht den Zugriff auf variadische Funktionsargumente
(Funktionsmakro) |
|
|
greift auf das nächste variadische Funktionsargument zu
(Funktionsmakro) |
|
|
(C99)
|
erstellt eine Kopie der variadischen Funktionsargumente
(Funktionsmakro) |
|
beendet die Durchlaufung der variadischen Funktionsargumente
(Funktionsmakro) |
|
|
enthält die von
va_start
,
va_arg
,
va_end
und
va_copy
benötigten Informationen
(Typdefinition) |
|
Inhaltsverzeichnis |
Hinweise
Obwohl altstilige (prototypenlose)
Funktionsdeklarationen
nachfolgende Funktionsaufrufe mit beliebig vielen Argumenten erlauben, dürfen sie nicht variadisch sein (seit C89). Die Definition solcher Funktionen muss eine feste Anzahl von Parametern angeben und darf nicht die
stdarg.h
Makros verwenden.
// Alte Deklarationsweise, entfernt in C23 int printx(); // Funktion, die auf diese Weise deklariert wurde printx("hello world"); // kann mit einem printx("a=%d b=%d", a, b); // oder mehr Argumenten aufgerufen werden // Das Verhalten mindestens eines dieser Aufrufe ist undefiniert, abhängig von // der Anzahl der Parameter, die die Funktion definiert
Beispiel
#include <stdio.h> #include <time.h> #include <stdarg.h> void tlog(const char* fmt,...) { char msg[50]; strftime(msg, sizeof msg, "%T", localtime(&(time_t){time(NULL)})); printf("[%s] ", msg); va_list args; va_start(args, fmt); vprintf(fmt, args); va_end(args); } int main(void) { tlog("logging %d %d %d...\n", 1, 2, 3); }
Ausgabe:
[10:21:38] logging 1 2 3...
Referenzen
- C17-Standard (ISO/IEC 9899:2018):
-
- 6.7.6.3/9 Funktionsdeklaratoren (einschließlich Prototypen) (S: 96)
-
- 7.16 Variable Argumente <stdarg.h> (S: 197-199)
- C11-Standard (ISO/IEC 9899:2011):
-
- 6.7.6.3/9 Funktionsdeklaratoren (einschließlich Prototypen) (S: 133)
-
- 7.16 Variable Argumente <stdarg.h> (S: 269-272)
- C99-Standard (ISO/IEC 9899:1999):
-
- 6.7.5.3/9 Funktionsdeklaratoren (einschließlich Prototypen) (S: 119)
-
- 7.15 Variable Argumente <stdarg.h> (S: 249-252)
- C89/C90 Standard (ISO/IEC 9899:1990):
-
- 3.5.4.3/5 Funktionsdeklaratoren (einschließlich Prototypen)
-
- 4.8 VARIABLE ARGUMENTE <stdarg.h>
Siehe auch
|
C++ Dokumentation
für
Variadic arguments
|