Variadische Argumente
Variadische Funktionen sind Funktionen, die mit einer unterschiedlichen Anzahl von Argumenten aufgerufen werden können.
Nur prototypisierte Funktionsdeklarationen dürfen variadisch sein. Dies wird durch den Parameter der Form ... angezeigt, der zuletzt in der Parameterliste erscheinen muss und auf mindestens einen benannten Parameter folgen muss(bis C23). Der Auslassungsparameter und der vorhergehende Parameter müssen durch ein , getrennt sein.
// Prototyped declaration int printx(const char* fmt, ...); // function declared this way printx("hello world"); // may be called with one printx("a=%d b=%d", a, b); // or more arguments int printz(...); // OK since C23 and in C++ // Error until C23: ... must follow at least one named parameter // int printy(..., const char* fmt); // Error: ... must be the last // int printa(const char* fmt...); // Error in C: ',' is required; OK in C++
Beim Funktionsaufruf unterliegt jedes Argument, das Teil der variadischen Argumentliste ist, speziellen impliziten Konvertierungen, die als Default-Argument-Promotions bekannt sind.
Innerhalb des Körpers einer Funktion, die variadische Argumente verwendet, können die Werte dieser Argumente mithilfe der <stdarg.h> Bibliotheksfunktionen abgerufen werden.
| Definiert in Header
<stdarg.h> | |
| ermöglicht den Zugriff auf variadische Funktionsargumente (function macro) | |
| greift auf das nächste variadische Funktionsargument zu (function macro) | |
| (C99) |
erstellt eine Kopie der variadischen Funktionsargumente (function macro) |
| beendet die Durchquerung der variadischen Funktionsargumente (function macro) | |
| enthält die von va_start, va_arg, va_end und va_copy benötigten Informationen (typedef) | |
Inhalt |
[bearbeiten] Hinweise
Obwohl ältere (prototypenlose) Funktionsdeklarationen nachfolgende Funktionsaufrufe mit beliebiger Anzahl von Argumenten zulassen, dürfen sie (ab C89) nicht variadisch sein. Die Definition einer solchen Funktion muss eine feste Anzahl von Parametern angeben und darf die stdarg.h Makros nicht verwenden.
// old-style declaration, removed in C23 int printx(); // function declared this way printx("hello world"); // may be called with one printx("a=%d b=%d", a, b); // or more arguments // the behavior of at least one of these calls is undefined, depending on // the number of parameters the function is defined to take
[bearbeiten] 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...
[bearbeiten] 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 ARGUMENTS <stdarg.h>
[bearbeiten] Siehe auch
| C++ Dokumentation für Variadische Argumente
|