Traductions de cette page?:

va_arg

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.

  1. D'abord, vous devez faire un appel à 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.
  2. Ensuite, vous devez appeler va_arg() en passant va_list et le type des argument à retourner. La valeur de retour de va_arg() est le paramètre courant.
  3. Répéter les appels à va_arg() jusqu'à ce que vous soyez arrivé au bout de la liste des arguments.
  4. Enfin, un appel à 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