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;
}
Utilice vprintf()
lugar.