Condividi tramite


va_arg, va_end, va_start

Elenchi di argomenti di variabile di accesso.

type va_arg(
   va_list arg_ptr,
   type 
);
void va_end(
   va_list arg_ptr 
);
void va_start(
   va_list arg_ptr,
   prev_param 
); // (ANSI version)
void va_start(
   arg_ptr 
);  // (Pre-ANSI-standardization version)

Parametri

  • type
    Tipo di argomento da recuperare.

  • arg_ptr
    Puntatore all'elenco di argomenti.

  • prev_param
    Parametro che precede il primo argomento facoltativo (solo ANSI).

Valore restituito

va_argRestituisce l'argomento corrente; va_starte va_end non restituiscono valori.

Note

Il va_arg, va_end, e va_start le macro consentono di accedere agli argomenti a una funzione quando la funzione accetta un numero variabile di argomenti in modo portabile.Sono disponibili due versioni delle macro: macro definite in STDARG.H conformi allo standard ANSI C.Macro definite in VARARGS.H sono obsoleti e restare per compatibilità con le versioni precedenti.Sono stati progettati per l'uso prima di standardizzazione ANSI.

Queste macro si presuppongono che la funzione accetta un numero fisso di argomenti richiesti, seguita da un numero variabile di argomenti facoltativi.Gli argomenti richiesti sono dichiarati come normali parametri alla funzione e sono accessibili tramite i nomi dei parametri.Gli argomenti facoltativi sono accessibili tramite le macro in STDARG.H o VARARGS.H, che consente di impostare un puntatore al primo argomento facoltativo nell'elenco di argomenti, recuperare argomenti dall'elenco e reimpostare il puntatore al termine dell'elaborazione di argomento.

ANSI c standard macro, definite in STDARG.H, vengono utilizzati come segue:

  • va_startImposta arg_ptr al primo argomento facoltativo nell'elenco di argomenti passati alla funzione.L'argomento arg_ptr devono avere va_list tipo.L'argomento prev_param è il nome del parametro richiesto immediatamente precedente il primo argomento facoltativo nell'elenco di argomenti.Se prev_param viene dichiarata con la classe di archiviazione del registro, comportamento della macro non è definito.va_startdeve essere utilizzata prima di va_arg viene utilizzato per la prima volta.

  • va_argRecupera un valore di type dalla posizione determinata dalla arg_ptr e gli incrementi arg_ptr per puntare all'argomento successivo nell'elenco, utilizzando le dimensioni di type per determinare il punto in cui inizia l'argomento successivo.va_argpuò essere utilizzato qualsiasi numero di volte all'interno della funzione per recuperare argomenti dall'elenco.

  • Dopo tutti gli argomenti sono stati recuperati, va_end consente di reimpostare il puntatore del mouse su NULL.

Nota di C++Nota di C++

Macro definite in VARARGS.H sono obsolete ed esiste unicamente per compatibilità con le versioni precedenti.Utilizzare le macro definite in STDARGS.H, a meno che non si lavora con codice prima lo standard ANSI.

Quando viene compilato con /clr (Compilazione Common Language Runtime), i programmi che utilizzano queste macro potrebbero generare risultati imprevisti a causa delle differenze tra i sistemi di tipo nativo e common language runtime.Si consideri questo programma:

#include <stdio.h>
#include <stdarg.h>

void testit ( int i, ...)
{
   va_list argptr;
   va_start(argptr, i);

   if ( i == 0 ) {
      int n = va_arg( argptr, int );
      printf( "%d\n", n );
   } else {
      char *s = va_arg( argptr, char* );
      printf( "%s\n", s);
   }
}

int main()
{
   testit( 0, 0xFFFFFFFF ); // 1st problem: 0xffffffff is not an int
   testit( 1, NULL );       // 2nd problem: NULL is not a char*
}

Si noti che testit previsto dal secondo parametro per essere rappresentato da un int o un char*.Gli argomenti passati sono 0xffffffff (un unsigned int, non un int) e NULL (effettivamente un int, non un char*).Quando viene compilato per il codice nativo, il programma produce l'output

-1
(null)

Tuttavia, quando viene compilato con /clr:pure, tipi non corrispondenti provocano il programma generare un'eccezione.La soluzione consiste nell'utilizzare cast espliciti:

int main()
{
   testit( 0, (int)0xFFFFFFFF ); // cast unsigned to int
   testit( 1, (char*)NULL );     // cast int to char*
}

Requisiti

Intestazione: <stdio.h> e <stdarg.h>

Intestazione precedente: <varargs.h>

Librerie

Tutte le versioni di librerie di run-time c.

Esempio

// crt_va.c
/* The program below illustrates passing a variable
 * number of arguments using the following macros:
 *      va_start            va_arg              va_end
 *      va_list
 */

#include <stdio.h>
#include <stdarg.h>
int average( int first, ... );

int main( void )
{
   /* Call with 3 integers (-1 is used as terminator). */
   printf( "Average is: %d\n", average( 2, 3, 4, -1 ) );

   /* Call with 4 integers. */
   printf( "Average is: %d\n", average( 5, 7, 9, 11, -1 ) );

   /* Call with just -1 terminator. */
   printf( "Average is: %d\n", average( -1 ) );
}

/* Returns the average of a variable list of integers. */
int average( int first, ... )
{
   int count = 0, sum = 0, i = first;
   va_list marker;

   va_start( marker, first );     /* Initialize variable arguments. */
   while( i != -1 )
   {
      sum += i;
      count++;
      i = va_arg( marker, int);
   }
   va_end( marker );              /* Reset variable arguments.      */
   return( sum ? (sum / count) : 0 );
}

Output

Average is: 3
Average is: 8
Average is: 0

Equivalente .NET Framework

Classe System::ParamArrayAttribute

Vedere anche

Riferimenti

Argomento Access

vfprintf, _vfprintf_l, vfwprintf, _vfwprintf_l