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 :

La macro va_copy

La macro va_arg La macro va_end


Utilisation

va_copy( vaListDest, vaListSrc );

Cette macro (attention, ce n'est pas une fonction) permet de dupliquer l'état d'une structure de données de type va_list. Cette macro sera, par exemple, utile si vous devez parcourir à plusieurs reprise la liste de paramètres durant l'exécution de la fonction associée.

Attention : une variable de type va_list initialisée par copie doit impérativement être libérée via un appel à la macro va_end.

Paramètres

Exemple de code

Cette fonction affiche simplement la liste d'entier passé en paramètre. Néanmoins, chaque entier sera séparé du suivant par la chaîne de caractères ", ", sauf pour le dernier. Bien qu'on aurait pu imaginer un autre algorithme, deux boucles de parcours de la liste vont être réalisés pour connaitre à l'avance le nombre de paramètres.

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

void doubleLoop( int first, ... ) {
    va_list vl;
    va_start( vl, first );

    /* First loop: count parameters */
    size_t count = 1;
    va_list vlTemp;
    va_copy( vlTemp, vl );
    int current;
    do {
        current = (int) va_arg( vlTemp, int );
        if ( current != -1 ) count++;
    } while( current != -1 );
    va_end( vlTemp );

    /* Second loop: display values */
    printf( "%d%s", first, (count>1?", ":"\n") );
    for( int i=1; i<count; i++ ) {
        current = (int) va_arg( vl, int );
        printf( "%d%s", current, (i<count-1?", ":"\n") );
    }
    va_end( vl );
}

int main( int argc, char * argv[] ) {

    doubleLoop( 10, 20, 30, -1 );
    doubleLoop( 50, 60, -1 );

    return EXIT_SUCCESS;

}

Les résultats produits seront :

$> sample
10, 20, 30
50, 60
$> 

Sujets connexes

va_arg
va_end
va_list
va_start


La macro va_arg La macro va_end