Looking for c Keywords? Try Ask4Keywords

C LanguageVariable Argumente


Einführung

Variablenargumente werden von Funktionen der printf-Familie ( printf , fprintf usw.) und anderen verwendet, um zu ermöglichen, dass eine Funktion jedes Mal mit einer anderen Anzahl von Argumenten aufgerufen wird, daher der Name varargs .

Um Funktionen mithilfe der Variablenargumente zu implementieren, verwenden Sie #include <stdarg.h> .

Um Funktionen mit einer variablen Anzahl von Argumenten aufzurufen, stellen Sie sicher, dass es einen vollständigen Prototyp mit nachlaufenden Ellipsen im Gültigkeitsbereich gibt: void err_exit(const char *format, ...); zum Beispiel.

Syntax

  • void va_start (va_list ap, last ); / * Variadic Argumentverarbeitung starten; last ist der letzte Funktionsparameter vor den Ellipsen (“...”) * /
  • Typ va_arg (va_list ap, type); / * Nächstes variadisches Argument in der Liste erhalten; Vergewissern Sie sich, dass Sie den richtigen beworbenen Typ angeben * /
  • void va_end (va_list ap); / * Argumentverarbeitung beenden * /
  • va_copy ungültig (va_list dst, va_list src); / * C99 oder höher: Argumentliste, dh aktuelle Position in der Argumentverarbeitung, in eine andere Liste kopieren (zB um Argumente mehrfach zu übergeben) * /

Parameter

Parameter Einzelheiten
va_list ap Argumentzeiger, aktuelle Position in der Liste der variadischen Argumente
zuletzt Name des letzten nicht-variadischen Funktionsarguments, damit der Compiler den richtigen Ort für die Verarbeitung von variadischen Argumenten findet; darf nicht als register , Funktion oder Array-Typ deklariert werden
Art gefördert Typ des Arguments variadische (zB zum Lesen int für ein short int Argument)
va_list src aktueller zu kopierender Argumentzeiger
va_list dst neue Argumentliste, die ausgefüllt werden soll

Bemerkungen

Die Funktionen va_start , va_arg , va_end und va_copy sind eigentlich Makros.

va_start Sie sicher, dass Sie va_start immer zuerst und nur einmal aufrufen und va_end zuletzt und nur einmal sowie an jedem Exit-Punkt der Funktion aufrufen. Wenn Sie dies nicht tun, funktioniert dies möglicherweise auf Ihrem System, ist aber sicherlich nicht portierbar und führt daher zu Fehlern.

Achten Sie darauf, Ihre Funktion korrekt zu deklarieren, dh mit einem Prototyp, und beachten Sie die Einschränkungen für das letzte nicht-variadische Argument (nicht register , keine Funktion oder einen Array-Typ). Es ist nicht möglich, eine Funktion zu deklarieren, die nur variadische Argumente verwendet, da mindestens ein nicht-variadisches Argument erforderlich ist, um die Argumentverarbeitung starten zu können.

Wenn Sie va_arg aufrufen, müssen Sie den beförderten Argumenttyp anfordern, d. va_arg

  • short wird zu int (und unsigned short wird auch zu int befördert, es sei denn sizeof(unsigned short) == sizeof(int) . In diesem Fall wird es zu unsigned int .
  • float wird double .
  • signed char wird zu int ; unsigned char wird ebenfalls zu int befördert, es sei denn sizeof(unsigned char) == sizeof(int) , was selten der Fall ist.
  • char wird normalerweise zu int .
  • C99-Typen wie uint8_t oder int16_t werden ähnlich befördert.

Die Verarbeitung historischer (dh K & R) variadischer Argumente wird in <varargs.h> , sollte aber nicht verwendet werden, da sie veraltet ist. Die Verarbeitung variabischer Standardargumente (die hier beschriebene und in <stdarg.h> ) wurde in C89 eingeführt. va_copy Makro va_copy wurde in C99 eingeführt, wurde jedoch zuvor von vielen Compilern bereitgestellt.

Variable Argumente Verwandte Beispiele