2012-04-27 14 views
5

que estaba buscando algo de código sobre las macros, y me encontré con un código como este, para el «va_start» macro:¿Por qué stdarg.h tiene 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))) 

Me gustaría saber cuál es el objetivo de «__va_argsiz» funcionan exactamente. ¿Son las limitaciones de alineación?

Gracias!

+1

Su pregunta no tiene mucho sentido sin darnos detalles de la plataforma en la que encontró esto. –

Respuesta

4

Tanto la alineación y las reglas de la promoción de tipos por omisión en C.

3

Parece que se utiliza para calcular el comienzo de la lista de argumentos variable, en función del tamaño del primer argumento. El primer argumento es el normal requerido, es decir, para printf(), sería el puntero a la cadena de formateo.

1

Esto se utiliza para variable length arguments. Por ejemplo, printf utiliza dicha lista de argumentos de longitud variable. __va_argsiz calcula el tamaño de la lista y va_start determina el comienzo.

1

Sin "limitación", implementación. __va_argsizredondeasizeof(t), para un tipo t, en múltiplos de sizeof(int). Esto es necesario porque los argumentos desconocidos que se pasan en la pila de llamadas como parte del protocolo de llamada de la función varargs se alinean automáticamente y se asignan el espacio en múltiplos de sizeof(int) (aparentemente en su plataforma) y deben recuperarse correctamente desde allí.

Véase también http://www.cplusplus.com/reference/clibrary/cstdarg/va_start/.

Cuestiones relacionadas