Namensräume
Varianten
Aktionen

va_arg

Von cppreference.com
< c‎ | variadic
Definiert in Header <stdarg.h>
T va_arg( va_list ap, T );

Das Makro va_arg wird zu einem Ausdruck vom Typ T erweitert, 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 worden sein, ohne dazwischenliegenden Aufruf von va_end. Jede Ausführung des Makros va_arg modifiziert ap, sodass es auf das nächste variable Argument zeigt.

Wenn der Typ des nächsten Arguments in ap (nach Promotion) 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 ein Zeiger auf void und der andere ist ein Zeiger auf einen Zeigertyp.

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

Inhalt

[edit] Parameter

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

[edit] Erweiterter Wert

das nächste variable Parameter in ap

[edit] 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

[edit] Referenzen

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

[edit] Siehe auch

erstellt eine Kopie der variadischen Funktionsargumente
(function macro) [edit]
beendet die Durchquerung der variadischen Funktionsargumente
(function macro) [edit]
enthält die von va_start, va_arg, va_end und va_copy benötigten Informationen
(typedef) [edit]
ermöglicht den Zugriff auf variadische Funktionsargumente
(function macro) [edit]
C++ Dokumentation für va_arg