Namespaces
Variants

va_start

From cppreference.net
Défini dans l'en-tête <stdarg.h>
void va_start ( va_list ap, parmN ) ;
(jusqu'à C23)
void va_start ( va_list ap, ... ) ;
(depuis C23)

La macro va_start permet d'accéder aux arguments variables suivant l'argument nommé parmN (jusqu'à C23) .

va_start doit être invoqué avec une instance d'un objet va_list valide ap avant tout appel à va_arg .

Si parmN est déclaré avec le spécificateur de classe de stockage register , avec un type tableau, avec un type fonction, ou avec un type non compatible avec le type résultant des promotions d'arguments par défaut, le comportement est indéfini.

(jusqu'en C23)

Seul le premier argument passé à va_start est évalué. Tous les arguments supplémentaires ne sont ni développés ni utilisés de quelque manière que ce soit.

(depuis C23)

Table des matières

Paramètres

ap - une instance du type va_list
parmN - le paramètre nommé précédant le premier paramètre variable

Valeur développée

(aucun)

Exemple

#include <stdio.h>
#include <stdarg.h>
int add_nums_C99(int count, ...)
{
    int result = 0;
    va_list args;
    va_start(args, count); // count peut être omis depuis C23
    for (int i = 0; i < count; ++i) {
        result += va_arg(args, int);
    }
    va_end(args);
    return result;
}
#if __STDC_VERSION__ > 201710L
// Identique au-dessus, valide depuis 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
}

Sortie possible :

150
150

Références

  • Norme C17 (ISO/CEI 9899:2018) :
  • 7.16.1.4 La macro va_start (p: 198-199)
  • Norme C11 (ISO/CEI 9899:2011) :
  • 7.16.1.4 La macro va_start (p: 271-272)
  • Norme C99 (ISO/IEC 9899:1999) :
  • 7.15.1.4 La macro va_start (p : 251-252)
  • Norme C89/C90 (ISO/IEC 9899:1990) :
  • 4.8.1.1 La macro va_start

Voir aussi

accède à l'argument suivant de la fonction variadique
(macro de fonction)
(C99)
effectue une copie des arguments de la fonction variadique
(macro de fonction)
termine le parcours des arguments de la fonction variadique
(macro de fonction)
contient les informations nécessaires pour va_start , va_arg , va_end , et va_copy
(typedef)
Documentation C++ pour va_start