Namespaces
Variants

va_arg

De fr.cppreference.net
 
 
Bibliothèque d'utilitaires
Support du langage
Support des types (types de base, RTTI)
Macros de test de fonctionnalités de la bibliothèque (C++20)
Utilitaires de programme
Fonctions variadiques
Support des coroutines (C++20)
Support des contrats (C++26)
Comparaison à trois voies
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

Utilitaires généraux
Opérateurs relationnels (déprécié en C++20)
 
 
Défini dans l'en-tête <cstdarg>
T va_arg( std::va_list ap, T );

La macro va_arg se développe en une expression de type T qui correspond au paramètre suivant de la va_list ap.

Avant d'appeler va_arg, ap doit être initialisé par un appel à soit va_start ou va_copy, sans appel intermédiaire à va_end. Chaque invocation de la macro va_arg modifie ap pour qu'il pointe vers l'argument variable suivant.

Si le type de l'argument suivant 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 (char, signed char, ou unsigned char).

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

Paramètres

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

Valeur développée

Le paramètre variable suivant dans ap .

Exemple

#include <cstdarg>
#include <cstdio>
#include <iostream>
void print_variance(std::size_t count, const char* fmt, ...)
{
    double sum = 0;
    double sum_sq = 0;
    std::va_list args;
    va_start(args, fmt);
    for (std::size_t i = count; i--;)
    {
        double num = va_arg(args, double);
        sum += num;
        sum_sq += num* num;
    }
    va_end(args);
    std::printf(fmt, sum_sq / count - (sum / count) * (sum / count));
}
void nano_printf(const char* fmt, ...)
{
    std::va_list args;
    va_start(args, fmt);
    for (const char* p = fmt; *p != '\0'; ++p)
    {
        switch (*p)
        {
        case '%':
            switch (*++p) // lire le symbole de format
            {
                case 'i':
                    std::cout << va_arg(args, int);
                    continue;
                case 'f':
                    std::cout << va_arg(args, double);
                    continue;
                case 's':
                    std::cout << va_arg(args, const char*);
                    continue;
                case 'c':
                    std::cout << static_cast<char>(va_arg(args, int));
                    continue;
                case '%':
                    std::cout << '%';
                    continue;
                /* ...plus de cas... */
            }
            break; // erreur de format...
        case '\n':
            std::cout << '\n';
            continue;
        case '\t':
            std::cout << '\t';
            continue;
        /* ...plus de cas... */
        }
        std::cout << *p;
    }
    va_end(args);
}
int main()
{
    print_variance(4, "%f\n", 25.0, 27.3, 26.9, 25.7);
    nano_printf("Args: %i%% %c%f %s\n", 42, '#', 3.14, "C++");
}

Sortie :

0.846875
Args: 42% #3.14 C++

Voir aussi

permet d'accéder aux arguments des fonctions variadiques
(macro de fonction)
(C++11)
effectue une copie des arguments des fonctions variadiques
(macro de fonction)
termine le parcours des arguments des fonctions variadiques
(macro de fonction)
Documentation C pour va_arg