Namespaces
Variants

va_arg

From cppreference.net
Défini dans l'en-tête <stdarg.h>
T va_arg ( va_list ap, T ) ;

La macro va_arg s'étend en une expression de type T qui correspond au paramètre suivant du va_list ap .

Avant d'appeler va_arg , ap doit être initialisé par un appel à va_start ou va_copy , sans appel intermédiaire à va_end . Chaque invocation de la macro va_arg modifie ap pour pointer vers le prochain argument variable.

Si le type du prochain argument dans ap (après promotions) n'est pas compatible avec T , le comportement est indéfini, sauf si :

  • un type est un type entier signé, l'autre type est le type entier non signé correspondant, et la valeur est représentable dans les deux types ; ou
  • un type est un pointeur vers void et l'autre est un pointeur vers un type caractère.

Si va_arg est appelé lorsqu'il n'y a plus d'arguments dans ap , le comportement est indéfini.

Table des matières

Paramètres

ap - une instance du type va_list
T - le type du paramètre suivant dans ap

Valeur développée

le prochain paramètre variable dans ap

Exemple

#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));
}

Sortie :

0.920258

Références

  • Norme C23 (ISO/CEI 9899:2024) :
  • 7.16.2.2 La macro va_arg (p: TBD)
  • Norme C17 (ISO/CEI 9899:2018) :
  • 7.16.1.1 La macro va_arg (p: TBD)
  • Norme C11 (ISO/IEC 9899:2011) :
  • 7.16.1.1 La macro va_arg (p: 269-270)
  • Norme C99 (ISO/CEI 9899:1999) :
  • 7.15.1.1 La macro va_arg (p : 249-250)
  • Norme C89/C90 (ISO/IEC 9899:1990) :
  • 4.8.1.2 La macro va_arg

Voir aussi

(C99)
effectue une copie des arguments de fonction variadiques
(macro de fonction)
termine le parcours des arguments de fonction variadiques
(macro de fonction)
contient les informations nécessaires pour va_start , va_arg , va_end , et va_copy
(typedef)
permet l'accès aux arguments de fonction variadiques
(macro de fonction)