Namespaces
Variants

va_start

De fr.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 variablessuivant l'argument nommé parmN(jusqu'à C23).

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

Si parmN est déclaré avec un spécificateur de classe de stockageregister, 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'à C23)

Si plus d'un argument est présent pour va_start, les jetons de prétraitement comprenant le deuxième et les arguments suivants sont ignorés. Si l'un de ces arguments se développe en incluant des parenthèses non équilibrées, ou un jeton de prétraitement qui ne se convertit pas en jeton, le comportement est indéfini.

(depuis C23)

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

(aucune)

Exemple

#include <stdarg.h>
#include <stdio.h>

int add_nums_C99(int count, ...)
{
    int result = 0;
    va_list args;
    va_start(args, count); // count can be omitted since C23
    
    for (int i = 0; i < count; ++i)
        result += va_arg(args, int);
    
    va_end(args);
    return result;
}

#if __STDC_VERSION__ > 201710L
// Same as above, valid since 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 C23 (ISO/IEC 9899:2024) :
  • 7.16.1.4 La macro va_start (p : 290-292)
  • Norme C17 (ISO/IEC 9899:2018) :
  • 7.16.1.4 La macro va_start (p : 198-199)
  • Norme C11 (ISO/IEC 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 au prochain argument de fonction variadique
(macro de fonction)
fait une copie des arguments de fonction variadique
(macro de fonction)
termine le parcours des arguments de fonction variadique
(macro de fonction)
contient les informations nécessaires à va_start, va_arg, va_end, et va_copy
(typedef)
Documentation C++ pour va_start