Condividi tramite


Funzioni con elenchi di argomenti variabili

Le funzioni che richiedono elenchi di 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 descritti nel file di inclusione STDARG.H per accedere agli argomenti passati da un elenco di variabili. 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 il modo in cui le macro va_start, va_arg e va_end possono essere utilizzate con il tipo va_list (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 di elenco come una variabile di tipo va_list prima che venga eseguito l'accesso a qualsiasi argomento di variabile. Nell'esempio precedente il marcatore viene denominato vl.

  • Ai singoli argomenti si accede utilizzando la macro va_arg. È necessario indicare alla macro va_arg 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 al tipo desiderato utilizzando la macro va_arg.

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

Vedere anche

Riferimenti

Definizioni di funzioni C++