Namespaces
Variants

va_start

From cppreference.net
Definiert in Header <stdarg.h>
void va_start ( va_list ap, parmN ) ;
(bis C23)
void va_start ( va_list ap, ... ) ;
(seit C23)

Das va_start Makro ermöglicht den Zugriff auf die variablen Argumente nach dem benannten Argument parmN (bis C23) .

va_start muss mit einer Instanz eines gültigen va_list -Objekts ap aufgerufen werden, bevor irgendwelche Aufrufe von va_arg erfolgen.

Wenn parmN mit dem register -Speicherklassenspezifizierer deklariert wird, mit einem Array-Typ, mit einem Funktionstyp oder mit einem Typ, der nicht mit dem Typ kompatibel ist, der sich aus den Standardargumentpromotionen ergibt, ist das Verhalten undefiniert.

(until C23)

Nur das erste an va_start übergebene Argument wird ausgewertet. Zusätzliche Argumente werden weder expandiert noch auf irgendeine Weise verwendet.

(since C23)

Inhaltsverzeichnis

Parameter

ap - eine Instanz des Typs va_list
parmN - der benannte Parameter vor dem ersten variablen Parameter

Erweiterter Wert

(keine)

Beispiel

#include <stdio.h>
#include <stdarg.h>
int add_nums_C99(int count, ...)
{
    int result = 0;
    va_list args;
    va_start(args, count); // count kann seit C23 weggelassen werden
    for (int i = 0; i < count; ++i) {
        result += va_arg(args, int);
    }
    va_end(args);
    return result;
}
#if __STDC_VERSION__ > 201710L
// Wie oben, gültig seit C23
int add_nums_C23(...)
{
    int result = 0;
    va_list args;
    va_start(args);
    int count = va_arg(args, int);
    for (int i = 0; i < count; ++i) {
        result += va_arg(args, int);
    }
    va_end(args);
    return result;
}
#endif
int main(void)
{
    printf("%d\n", add_nums_C99(4, 25, 25, 50, 50));
#if __STDC_VERSION__ > 201710L
    printf("%d\n", add_nums_C23(4, 25, 25, 50, 50));
#endif
}

Mögliche Ausgabe:

150
150

Referenzen

  • C17-Standard (ISO/IEC 9899:2018):
  • 7.16.1.4 Die va_start-Makro (S: 198-199)
  • C11-Standard (ISO/IEC 9899:2011):
  • 7.16.1.4 The va_start macro (S: 271-272)
  • C99-Standard (ISO/IEC 9899:1999):
  • 7.15.1.4 Die va_start-Makro (S: 251-252)
  • C89/C90 Standard (ISO/IEC 9899:1990):
  • 4.8.1.1 Die va_start-Makro

Siehe auch

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)
C++-Dokumentation für va_start