Syntaxe :
#include <cstdarg> type va_arg( va_list argptr, type ); void va_end( va_list argptr ); void va_start( va_list argptr, last_parm );
Les macros va_arg()
sont utilisée pour passer un nombre de paramètres variables
à une fonction.
va_start()
en passant une va_list
valide et un argument obligatoire qui précède immédiatement le …
des arguments de la fonction. Si vous n'avez qu'un seul argument obligatoire, il est votre argument. Le prototype de la fonction doit comporter au moins un argument obligatoire. Ce paramètre peut être n'importe quoi, un exemple d'utilisation courante est d'envoyer le nombre de paramètre de la liste de taille variable.va_arg()
en passant va_list
et le type des argument à retourner. La valeur de retour de va_arg()
est le paramètre courant.va_arg()
jusqu'à ce que vous soyez arrivé au bout de la liste des arguments.va_end()
en passant va_list
en argument est nécessaire pour un nettoyage de la mémoire correct.Par exemple :
int somme( int nb, ... ) { int res = 0; va_list argptr; va_start( argptr, nb); for( ; num > 0; num-- ) { res += va_arg( argptr, int ); } va_end( argptr ); return res; } int main( void ) { int res = somme( 4, 4, 3, 2, 1 ); printf( "le résultat est %d\n", res); return 0 ; }
Ce code affiche 10 sur la sortie standard (4+3+2+1).
Voici un autre exemple de fonction à nombre d'arguments variable qui Here is another example of variable argument function, which is a simple printing function:
void mon_printf(char *format, ... ) { va_list argptr; va_start(argptr, format); while(*format != '\0') { // chaîne de charactères if(*format == 's') { char* s = va_arg(argptr, char *); printf("Affichage d'une chaîne de caractères : %s\n", s); } // caractère else if(*format == 'c') { char c = (char) va_arg(argptr, int); printf("Affichage d'un caractère : %c\n", c); } // integer else if(*format == 'd') { int d = va_arg(argptr, int); printf("Affichage d'un entier : %d\n", d); } format++; } va_end(argptr); } int main(void) { mon_printf( "sdc", "Ceci est une chaîne de caractères", 29, 'X' ); return 0; }
Ce code produit ceci sur le flux de sortie This code displays the following output when run:
Affichage d'une chaîne de caractères : Ceci est une chaîne de caractères Affichage d'un entier : 29 Affichage d'un caractère : X