c variadic-functions

¿Cómo llenar una lista_v



variadic-functions (3)

No creo que haya una forma estandarizada de hacer esto. Por otro lado, tal lista precargada de lista de va_list sería bastante inútil, ya que tampoco hay forma de "consultarla" por el número y los tipos de argumentos disponibles.

Si tengo un va_list sé cómo extraer todos sus elementos:

void printInts(int n,...) { va_list va; va_start(va, n); for(unsigned int i=0; i<n; i++) { int arg=va_arg(va, int); printf("%d",arg); } va_end(va); }

Por eso, cuando llamo a printInts (3,1,2,3), la lista va se llena de todos los parámetros.
Pero, ¿cómo puedo rellenar manualmente una lista_ va sin utilizar va_start? Quiero decir que quiero algo como:

va_list va; push_arg(va, int, 5); // And so on until I fill all parameters ...

Necesito esto porque hay una función que acepta un va_list como argumento, y no sé cómo llenar ese va_list de todos sus parámetros.


No hay capacidad para llenar una lista de valores de forma explícita.

Deberías escribir una función de envoltorio. Supongamos que necesita llamar a su función foo, en lugar de rellenar manualmente una lista_de_vista, define una nueva función así:

void call_foo(int arg1, ...) { va_list ap; va_start(ap, arg1); foo(arg1, ap); va_end(ap); }

Ahora puede llamar a foo , que toma una lista de va, como desee, por ejemplo, haciendo call_foo (1,2,3,4) ;, call_foo (1, 1, "Hola"); etc.

Esto solo le permitirá especificar los argumentos en tiempo de compilación, no puede generar los argumentos en tiempo de ejecución.


Normalmente, estas funciones vienen en pares. Si tiene una función de "aceptación", es fácil crear otra:

void printInts_v(int n, va_list ap) { unsigned int i=0; for(i=0; i<n; i++) { int arg=va_arg(ap, int); printf("%d", arg); } }

Esta función se puede llamar de esta manera:

void printInts(int n,...) { va_list ap; va_start(ap, n); printInts_v(n, ap); va_end(va); }

Pero no creo que haya una forma de rellenar de forma va_list una va_list para su uso posterior.

Sin embargo, si trabaja en una arquitectura y la portabilidad no es un problema, podría crear algo por su cuenta. Cómo exactamente hacer eso es específico de la plataforma.