Participer au site avec un Tip
Rechercher
 

Améliorations / Corrections

Vous avez des améliorations (ou des corrections) à proposer pour ce document : je vous remerçie par avance de m'en faire part, cela m'aide à améliorer le site.

Emplacement :

Description des améliorations :

Vous êtes un professionnel et vous avez besoin d'une formation ? Programmation avec
Le langage C
Voir le programme détaillé

Macro va_start

Le type va_list


Entête à inclure

#include <stdarg.h>  // <cstdarg> en C++

Macro va_start

void va_start( va_list ap, ... ); // C23

Cette macro initialise une variable de type va_list. Elle doit être appelée avant le premier accès aux arguments non nommés avec va_arg.

Jusqu'à C17, l'appel usuel est va_start( arguments, lastNamedParameter ), où le second argument est le dernier paramètre nommé avant .... Depuis C23, la forme va_start( arguments ) est disponible. Les arguments supplémentaires restent acceptés par compatibilité avec les anciens codes.

Paramètre

Exemple de code

L'exemple suivant montre l'utilisation compatible C89/C99/C11/C17 : le premier argument indique combien d'entiers doivent être lus.

 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
 10 
 11 
 12 
 13 
 14 
 15 
 16 
 17 
 18 
 19 
 20 
 21 
 22 
 23 
 24 
 25 
 26 
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>

int maximum( int counter, ... ) {

    va_list arguments;
    va_start( arguments, counter );

    int max = va_arg( arguments, int );
    for ( int index = 1; index < counter; index++ ) {
        int value = va_arg( arguments, int );
        if ( value > max ) {
            max = value;
        }
    }

    va_end( arguments );
    return max;
}

int main() {

    printf( "%d\n", maximum( 4, 2, 11, 5, 8 ) );
    return EXIT_SUCCESS;
}
Utilisation classique de va_start

Cet exemple produit l'affichage suivant.

11

Forme C23

Depuis C23, il est possible d'écrire une fonction dont la liste de paramètres ne contient que .... Dans ce cas, les informations de cadrage, comme le nombre d'arguments ou une sentinelle de fin, doivent elles aussi être passées dans la partie variable.

 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
 10 
 11 
 12 
 13 
 14 
 15 
 16 
 17 
 18 
 19 
 20 
 21 
 22 
 23 
 24 
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>

int addition( ... ) {

    va_list arguments;
    va_start( arguments );

    int counter = va_arg( arguments, int );
    int sum = 0;
    for ( int index = 0; index < counter; index++ ) {
        sum += va_arg( arguments, int );
    }

    va_end( arguments );
    return sum;
}

int main() {

    printf( "%d\n", addition( 3, 10, 20, 30 ) );
    return EXIT_SUCCESS;
}
Forme C23 de va_start

Cet exemple utilise une syntaxe C23. Il produit l'affichage suivant.

60

Sujets connexes

va_arg
va_copy
va_end
va_list


Le type va_list




Vous êtes un professionnel et vous avez besoin d'une formation ? Programmation avec
Le langage C
Voir le programme détaillé