La macro va_copy

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

  • vaListSrc : la variable de type va_list à dupliquer.
  • vaListDest : une autre variable de type va_list qui va recevoir l'état de la première.

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