Namespaces
Variants

va_start

Von de.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 Argumentedie auf das benannte Argument folgen parmN(bis C23).

va_start muss mit einer Instanz eines gültigen va_list Objekts ap vor jedem Aufruf von va_arg aufgerufen werden.

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

(bis C23)

Wenn mehr als ein Argument für va_start vorhanden ist, werden die Präprozessor-Tokens, die das zweite und die folgenden Argumente umfassen, verworfen. Wenn eines dieser Argumente zu unausgeglichenen Klammern oder einem Präprozessor-Token expandiert, das nicht in ein Token konvertiert wird, ist das Verhalten undefiniert.

(seit C23)

Parameter

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

Erweiterter Wert

(keiner)

Beispiel

#include <stdarg.h>
#include <stdio.h>

int add_nums_C99(int count, ...)
{
    int result = 0;
    va_list args;
    va_start(args, count); // count can be omitted since C23
    
    for (int i = 0; i < count; ++i)
        result += va_arg(args, int);
    
    va_end(args);
    return result;
}

#if __STDC_VERSION__ > 201710L
// Same as above, valid since 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

  • C23-Standard (ISO/IEC 9899:2024):
  • 7.16.1.4 Das va_start-Makro (S. 290-292)
  • C17-Standard (ISO/IEC 9899:2018):
  • 7.16.1.4 Das va_start-Makro (S. 198-199)
  • C11-Standard (ISO/IEC 9899:2011):
  • 7.16.1.4 Das va_start-Makro (S. 271-272)
  • C99-Standard (ISO/IEC 9899:1999):
  • 7.16.1.4 Das va_start-Makro (S. 251-252)
  • C89/C90-Standard (ISO/IEC 9899:1990):
  • 4.8.1.1 Das va_start-Makro

Siehe auch

greift auf das nächste variadische Funktionsargument zu
(Funktionsmakro)
erstellt eine Kopie der variadischen Funktionsargumente
(Funktionsmakro)
beendet die Traversierung der variadischen Funktionsargumente
(Funktionsmakro)
enthält die Informationen, die von va_start, va_arg, va_end, und va_copy
(Typedef)
C++-Dokumentation für va_start