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
.
va_list
à dupliquer.
va_list
qui va recevoir l'état de la
première.
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 $>
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 :