Namespaces
Variants

va_arg

From cppreference.net
Definiert im Header <stdarg.h>
T va_arg ( va_list ap, T ) ;

Das va_arg Makro expandiert zu einem Ausdruck vom Typ T , der dem nächsten Parameter aus der va_list ap entspricht.

Vor dem Aufruf von va_arg muss ap durch einen Aufruf von entweder va_start oder va_copy initialisiert werden, ohne dass zwischenzeitlich va_end aufgerufen wurde. Jeder Aufruf des va_arg -Makros modifiziert ap , um auf das nächste variable Argument zu zeigen.

Wenn der Typ des nächsten Arguments in ap (nach Durchführung von Promotions) nicht kompatibel mit T ist, ist das Verhalten undefiniert, es sei denn:

  • ein Typ ist ein vorzeichenbehafteter Ganzzahltyp, der andere Typ ist der entsprechende vorzeichenlose Ganzzahltyp, und der Wert ist in beiden Typen darstellbar; oder
  • ein Typ ist Zeiger auf void und der andere ist ein Zeiger auf einen Zeichentyp.

Wenn va_arg aufgerufen wird, wenn keine weiteren Argumente in ap vorhanden sind, ist das Verhalten undefiniert.

Inhaltsverzeichnis

Parameter

ap - eine Instanz des va_list -Typs
T - der Typ des nächsten Parameters in ap

Erweiterter Wert

der nächste variable Parameter in ap

Beispiel

#include <math.h>
#include <stdarg.h>
#include <stdio.h>
double stddev(int count, ...)
{
    double sum = 0;
    double sum_sq = 0;
    va_list args;
    va_start(args, count);
    for (int i = 0; i < count; ++i)
    {
        double num = va_arg(args, double);
        sum += num;
        sum_sq += num*num;
    }
    va_end(args);
    return sqrt(sum_sq / count - (sum / count) * (sum / count));
}
int main(void)
{
    printf("%f\n", stddev(4, 25.0, 27.3, 26.9, 25.7));
}

Ausgabe:

0.920258

Referenzen

  • C23-Standard (ISO/IEC 9899:2024):
  • 7.16.2.2 The va_arg macro (S.: TBD)
  • C17-Standard (ISO/IEC 9899:2018):
  • 7.16.1.1 Die va_arg-Makro (S.: TBD)
  • C11-Standard (ISO/IEC 9899:2011):
  • 7.16.1.1 The va_arg macro (p: 269-270)
  • C99-Standard (ISO/IEC 9899:1999):
  • 7.15.1.1 Die va_arg-Makro (S: 249-250)
  • C89/C90 Standard (ISO/IEC 9899:1990):
  • 4.8.1.2 Die va_arg-Makro

Siehe auch

(C99)
erstellt eine Kopie der variadischen Funktionsargumente
(Funktionsmakro)
beendet das Durchlaufen der variadischen Funktionsargumente
(Funktionsmakro)
enthält die von va_start , va_arg , va_end und va_copy benötigten Informationen
(typedef)
ermöglicht den Zugriff auf variadische Funktionsargumente
(Funktionsmakro)