Partager via


Fonctions avec listes d'arguments variables

Les fonctions qui requièrent des listes de variables sont déclarées avec des points de suspension (...) dans la liste d'arguments, comme décrit dans Listes des arguments variables. Utilisez les types et les macros décrits dans le fichier Include STDARG.H pour accéder aux arguments passés par une liste de variables. Pour plus d'informations sur ces macros, consultez va_arg, va_end, va_start dans la documentation de la bibliothèque Runtime C.

Exemple

L'exemple ci-dessous montre comment les macros va_start, va_arg et va_end fonctionnent avec le type va_list (déclaré dans STDARG.H) :

// variable_argument_lists.cpp
#include <stdio.h>
#include <stdarg.h>

//  Declaration, but not definition, of ShowVar.
void ShowVar( char *szTypes, ... );
int main() {
   ShowVar( "fcsi", 32.4f, 'a', "Test string", 4 );
}

//  ShowVar takes a format string of the form
//   "ifcs", where each character specifies the
//   type of the argument in that position.
//
//  i = int
//  f = float
//  c = char
//  s = string (char *)
//
//  Following the format specification is a variable 
//  list of arguments. Each argument corresponds to 
//  a format character in the format string to which 
// the szTypes parameter points 
void ShowVar( char *szTypes, ... ) {
   va_list vl;
   int i;

   //  szTypes is the last argument specified; you must access 
   //  all others using the variable-argument macros.
   va_start( vl, szTypes );

   // Step through the list.
   for( i = 0; szTypes[i] != '\0'; ++i ) {
      union Printable_t {
         int     i;
         float   f;
         char    c;
         char   *s;
      } Printable;

      switch( szTypes[i] ) {   // Type to expect.
         case 'i':
            Printable.i = va_arg( vl, int );
            printf_s( "%i\n", Printable.i );
         break;

         case 'f':
             Printable.f = va_arg( vl, double );
             printf_s( "%f\n", Printable.f );
         break;

         case 'c':
             Printable.c = va_arg( vl, char );
             printf_s( "%c\n", Printable.c );
         break;

         case 's':
             Printable.s = va_arg( vl, char * );
             printf_s( "%s\n", Printable.s );
         break;

         default:
         break;
      }
   }
   va_end( vl );
}
  

Commentaires

L'exemple ci-dessus illustre les concepts importants suivants :

  • Vous devez établir un marqueur de liste en tant que variable de type va_list avant d'accéder à tout argument variable. Dans l'exemple précédent, le marqueur est appelé vl.

  • L'accès aux arguments individuels s'effectue à l'aide de la macro va_arg. Vous devez indiquer à la macro va_arg le type d'argument à extraire afin qu'elle puisse transférer le nombre correct d'octets de la pile. Si vous spécifiez un type incorrect d'une taille différente de celle fournie par le programme appelant à va_arg, les résultats sont imprévisibles.

  • Vous devez effectuer un cast explicite du résultat obtenu à l'aide de la macro va_arg vers le type souhaité.

  • Vous devez appeler la macro va_end pour terminer le traitement des arguments variables.

Voir aussi

Référence

Définitions de fonction C++