Funzioni con elenchi di argomenti variabili

Le funzioni che richiedono gli elenchi variabili vengono dichiarate utilizzando i puntini di sospensione (...) nell'elenco di argomenti, come descritto in elenchi di argomenti variabili.Utilizzare i tipi e le macro che sono descritti nel file di inclusione di STDARG.H per accedere agli argomenti passati da un elenco variabile.per ulteriori informazioni su queste macro, vedere va_arg, va_end, va_start nella documentazione della libreria di runtime del linguaggio C.

Esempio

Nell'esempio seguente viene illustrato come va_start, va_arge va_end le macro collaborano con va_list tipo dichiarato in 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 );
}
  

Commenti

Nell'esempio precedente vengono illustrati questi concetti importanti:

  • È necessario stabilire un marcatore elenco come variabile di tipo va_list prima di qualsiasi variabile argomenti viene eseguito l'accesso.Nell'esempio precedente, il marcatore viene chiamato vl.

  • I singoli argomenti a cui si accede utilizzando va_arg macro.È necessario indicare va_arg macro il tipo di argomento da recuperare in modo che sia possibile trasferire il numero corretto di byte dallo stack.Se si specifica un tipo non corretto di dimensione diversa da quella fornita dal programma chiamante a va_arg, i risultati sono imprevedibili.

  • È necessario eseguire esplicitamente il cast del risultato ottenuto tramite va_arg macro al tipo desiderato.

  • È necessario chiamare va_end macro per terminare l'elaborazione dell'variabile-argomento.

Vedere anche

Riferimenti

Definizioni di funzioni C++