stdarg.h


Macro va_arg ANSI C

tipo va_arg(va_list pa, tipo);

Expande a una expresión que tiene el tipo y valor del siguiente argumento en la llamada. El parámetro pa será igual al de va_list argumento inicializado por va_start. Cada invocación de va_arg modifica pa tal que los valores de los argumentos sucesivos son retornados por turno. El parámetro tipo es un nombre de un tipo especificado, tal que el tipo del puntero a un objeto que tiene el tipo especificado, puede ser obtenido simplemente mediante añadiendo al final un * a tipo. Si no hay ningún argumento siguiente, o si tipo no es compatible con el tipo del siguiente argumento (promocionado según las promociones de argumentos por defecto), el compartamiento no está definido.

Valor de retorno:

La primera invocación de la macro va_arg después de aquélla de la macro va_start retorna el valor del argumento después de ésa, especificado por paramN. Invocaciones sucesivas retornan los valores de los argumentos restantes en sucesión.

Ejemplo:

#define __dj_va_rounded_size(T)  \
        (((sizeof (T) + sizeof (int) - 1) / sizeof (int)) * sizeof (int))
#define va_arg(ap, T) \
    (ap = (va_list) ((char *) (ap) + __dj_va_rounded_size (T)), \ 
    *((T *) (void *) ((char *) (ap) - __dj_va_rounded_size (T))))
DJGPP
#define __size(x) ((sizeof(x)+sizeof(int)-1) & ~(sizeof(int)-1)) 
#define va_arg(ap, type) (*(type _FAR *)(((*(char _FAR *_FAR \ 
  *)&(ap))+=__size(type))-(__size(type))))
Borland
#define __va_argsiz(t) \ 
    (((sizeof(t) + sizeof(int) - 1) / sizeof(int)) * sizeof(int))
#define va_arg(ap, t) \ 
    (((ap) = (ap) + __va_argsiz(t)),  \
    *((t*) (void*) ((ap) - __va_argsiz(t))))
Dev-C++