C LanguageArgomenti variabili


introduzione

Gli argomenti variabili sono usati dalle funzioni della famiglia printf ( printf , fprintf , ecc.) E altri per consentire a una funzione di essere chiamata ogni volta con un numero diverso di argomenti, da cui il nome varargs .

Per implementare le funzioni utilizzando la funzione di argomenti variabili, utilizzare #include <stdarg.h> .

Per chiamare le funzioni che accettano un numero variabile di argomenti, assicurarsi che esista un prototipo completo con i puntini di sospensione finali: void err_exit(const char *format, ...); per esempio.

Sintassi

  • void va_start (va_list ap, last ); / * Inizia l'elaborazione degli argomenti variadici; l'ultimo è l'ultimo parametro di funzione prima dei puntini di sospensione ("...") * /
  • digita va_arg (va_list ap, type ); / * Trova il prossimo argomento variadico nella lista; assicurati di passare il tipo corretto promosso * /
  • void va_end (va_list ap); / * Elaborazione argomento finale * /
  • void va_copy (va_list dst, va_list src); / * C99 o successivo: elenco degli argomenti della copia, ovvero la posizione corrente nell'elaborazione degli argomenti, in un'altra lista (ad esempio per passare più volte gli argomenti) * /

Parametri

Parametro Dettagli
va_list ap puntatore argomento, posizione corrente nell'elenco di argomenti variadici
scorso nome dell'ultimo argomento di funzione non variabile, quindi il compilatore trova il punto corretto per iniziare l'elaborazione degli argomenti variadici; potrebbe non essere dichiarato come variabile di register , funzione o tipo di matrice
genere tipo promosso dell'argomento variadic da leggere (es. int per un short int argomento short int )
va_list src puntatore argomento corrente da copiare
va_list dst nuovo elenco di argomenti da compilare

Osservazioni

Le va_start , va_arg , va_end e va_copy sono in realtà macro.

Assicurati di chiamare sempre va_start prima, e solo una volta, e di chiamare va_end ultimo, e solo una volta, e su ogni punto di uscita della funzione. Non farlo potrebbe funzionare sul tuo sistema ma sicuramente non è portabile e quindi invita bug.

Fare attenzione per dichiarare la funzione in modo corretto, vale a dire con un prototipo, e la mente le restrizioni l'ultimo argomento non variadic (non register , non è un tipo di funzione o array). Non è possibile dichiarare una funzione che accetta solo argomenti variadici, poiché è necessario almeno un argomento non-variadico per avviare l'elaborazione degli argomenti.

Quando si chiama va_arg , è necessario richiedere il tipo di argomento promosso , ovvero:

  • short è promosso a int (e unsigned short è anche promosso a int meno che sizeof(unsigned short) == sizeof(int) , nel qual caso viene promosso a unsigned int ).
  • float è promosso a double .
  • signed char è promosso a int ; unsigned char viene promosso a int meno che sizeof(unsigned char) == sizeof(int) , che raramente è il caso.
  • char è solitamente promosso a int .
  • I tipi C99 come uint8_t o int16_t sono promossi in modo simile.

L'elaborazione di argomenti variadici storici (cioè K & R) è dichiarata in <varargs.h> ma non dovrebbe essere utilizzata in quanto obsoleta. L'elaborazione standard degli argomenti variadici (quella descritta qui e dichiarata in <stdarg.h> ) è stata introdotta in C89; la macro va_copy stata introdotta in C99 ma fornita da molti compilatori precedenti.

Argomenti variabili Esempi correlati