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.
![]() |
---|
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