Pregunta

Quiero pasar un VA_List a otra función. Aquí hay un ejemplo de lo que estoy tratando de hacer:

void my_printf_1(char* string, ...){
    va_list   ap;
    va_start (ap, string);
    printf(string, ap);
    va_end(ap);
}

void my_printf_2(char* string, ...){
    va_list   ap;
    va_start (ap, string);
    printf(string, *ap);
    va_end(ap);
}

void main(void){
    my_printf_1("Hello %i\n", 12); //Shows me the Pointer
    my_printf_1("Hello \n"); //Runtime Error - too Many Arguments
    my_printf_2("Hello %i\n", 12); //Displays correctly because 12 < char
    my_printf_2("Hello %i\n", 500); //Displays incorrectly  because 500 > char
    my_printf_2("Hello %i %i\n", 12, 12); //Displays 12, then crashes Runtime Error not enough arguments
    my_printf_2("Hello \n"); //Runtime Error - too Many Arguments
}

Me parece que mi va_list ap es un char Pointer, ¿cómo puedo obtener toda la lista? ¿Cómo puedo reescribir? my_printf() para pasar el todo o un falso va_list a subfunciones? No puedo modificar mis subfunciones para aceptar va_list punteros, así que tendré que modificar my_printf.

Editar: Me doy cuenta de que lo siguiente funcionaría, sin embargo, esto no es lo que quiero.

void my_printf_1(char* string, ...){
va_list   ap;
va_start (ap, string);
vprintf(string, ap);
va_end(ap);
}
¿Fue útil?

Solución

Debes hacer lo que dices, pero explícitamente. Es decir, pase el real va_list objeto.

Ver el vsnprintf () función de inspiración. Funciones que toman una explícita va_list a menudo tienen prefijo con un v en la biblioteca estándar.

los va_list No tiene una estructura interna con la que pueda trabajar, es opaco. Todo lo que puedes hacer está definido en el u003Cstdarg.h> encabezamiento.

Otros consejos

Echa un vistazo a VPrintf y amigos. http://www.manpagez.com/man/3/vprintf/

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top