Pasar y usar el número variable de argumentos para funcionar en C

No entiendo por qué esto no se imprime “esto es una prueba 42” como lo espero?

1 #include  2 #include  3 4 #define ME(x) blah x 5 6 void blah(const char *fmt, ...) 7 { 8 va_list arg; 9 10 va_start(arg, fmt); 11 printf(fmt, arg); 12 va_end(arg); 13 } 14 15 int main() 16 { 17 ME(("this is a test %d\n", 42)); 18 19 return 0; 20 } 

En cambio, es algo como esto:

 $ gcc blah.c $ ./a.out this is a test 1606416656 

Quieres llamar a vprintf () en lugar de printf ().

Debe usar va_arg para obtener el valor del argumento real. Va_start es solo una inicialización de la variable arg. Arg es actualmente un puntero al valor en la stack, no es el valor en sí.

La siguiente línea obtiene el valor real:

 int myvalue = va_arg(arg,int); 

Observe que obtengo un int y no un corto, ya que los cortos se promueven automáticamente a int por el comstackdor de C.

EDIT: la respuesta de Uli también es correcta. Si desea pasar varios valores a printf, debe llamar a vprintf en lugar de a printf (y no es necesario llamar a va_arg, ya que en este caso no conoce los tipos exactos de los argumentos).