c printf variadic-functions

c - llame a printf usando va_list



variadic-functions (4)

void TestPrint(char* format, ...) { va_list argList; va_start(argList, format); printf(format, argList); va_end(argList); } int main() { TestPrint("Test print %s %d/n", "string", 55); return 0; }

Necesito conseguir:

Test print string 55

En realidad, tengo salida de basura. ¿Qué está mal en este código?


Así no es como usas printf() . Si desea usar las va_lists , use vprintf() lugar. Mira here referencia.


Como ya han señalado otros: En este caso, debe usar vprintf en vprintf lugar.

Pero si realmente desea envolver printf , o si desea envolver una función que no tenga una versión v... , puede hacerlo en GCC utilizando la función no estándar __builtin_apply :

int myfunction(char *fmt, ...) { void *arg = __builtin_apply_args(); void *ret = __builtin_apply((void*)printf, arg, 100); __builtin_return(ret); }

El último argumento para __builtin_apply es el máximo. Tamaño total de los argumentos en bytes. Asegúrese de usar un valor que sea lo suficientemente grande.


En lugar de printf, te recomiendo que pruebes vprintf, que fue creado para este propósito específico:

#include <stdio.h> #include <stdlib.h> #include <stdarg.h> void errmsg( const char* format, ... ) { va_list arglist; printf( "Error: " ); va_start( arglist, format ); vprintf( format, arglist ); va_end( arglist ); } int main( void ) { errmsg( "%s %d %s", "Failed", 100, "times" ); return EXIT_SUCCESS; }

Fuente: http://www.qnx.com/developers/docs/6.5.0/index.jsp?topic=/com.qnx.doc.neutrino_lib_ref/v/vprintf.html