2012-04-27 4 views
5

ero alla ricerca di un codice sulle macro, e ho trovato un codice come questo, per la macro «va_start»:Perché stdarg.h ha una macro «__va_size»?

#define __va_argsiz(t) \ 
    (((sizeof(t) + sizeof(int) - 1)/sizeof(int)) * sizeof(int)) 
#define va_start(ap, pN) \ 
    ((ap) = ((va_list) (&pN) + __va_argsiz(pN))) 

Vorrei sapere qual è l'obiettivo di «__va_argsiz» funzionano esattamente. Sono i limiti di allineamento?

Grazie!

+1

La tua domanda non ha molto senso senza fornirci dettagli della piattaforma in cui hai trovato questo. –

risposta

4

Sia l'allineamento, e le regole di promozione tipi predefiniti in C.

3

sembra che viene utilizzato per calcolare l'inizio della lista di argomenti variabili, in base alle dimensioni del primo argomento. Il primo argomento è quello richiesto normale, vale a dire per printf() sarebbe il puntatore alla stringa di formattazione.

1

Viene utilizzato per variable length arguments. Ad esempio, printf utilizza un elenco di argomenti di lunghezza variabile. __va_argsiz calcola la dimensione della lista e va_start determina l'inizio.

1

Nessuna "limitazione", implementazione. __va_argsizgiri fino la sizeof(t), per un tipo t, in multipli di sizeof(int). Ciò è necessario perché gli argomenti uknown che vengono passati sullo stack di chiamate come parte del protocollo di chiamata della funzione varargs vengono automaticamente allineati e allocano lo spazio in multipli di sizeof(int) (apparentemente, sulla piattaforma) e devono essere recuperati correttamente da lì.

Vedere anche http://www.cplusplus.com/reference/clibrary/cstdarg/va_start/.