Namespaces
Variants

Variadic arguments

From cppreference.net

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