2009-09-28 7 views
38

entiendo que la diferencia entre los printf, fprintf, sprintf funciones, etc y la vprintf, vfprintf, vsprintf funciones etc tiene que ver con la forma en que se ocupan de los argumentos de la función. ¿Pero cómo específicamente? ¿Hay realmente alguna razón para usar una sobre la otra? ¿Debo usar siempre printf ya que eso es algo más común de ver en C, o hay una razón legítima para elegir vprintf?¿cuál es la diferencia entre las familias de funciones printf y vprintf, y cuándo debo usar una sobre la otra?

Respuesta

59

printf() y sus amigos son de uso normal. vprintf() y amigos son para cuando quiere escribir su propia función printf() -like. Digamos que usted quiere escribir una función para imprimir errores:

int error(char *fmt, ...) 
{ 
    int result; 
    va_list args; 
    va_start(args, fmt); 
    // what here? 
    va_end(args); 
    return result; 
} 

Se dará cuenta de que no se puede pasar a argsprintf(), printf() ya lleva muchos argumentos, en lugar de uno va_list argumento. Los vprintf() funciones, sin embargo, hacen tomar un argumento va_list en lugar de un número variable de argumentos, por lo que aquí es la versión completa:

int error(char *fmt, ...) 
{ 
    int result; 
    va_list args; 
    va_start(args, fmt); 
    fputs("Error: ", stderr); 
    result = vfprintf(stderr, fmt, args); 
    va_end(args); 
    return result; 
} 
+1

Por supuesto, a continuación, desea una función '' advertir() que funciona como 'error()' pero imprime "Warning:" en su lugar, por lo que crea su función de estilo _own_ 'vprintf()': 'int verror (char * prefix, char * fmt, va_list args);' y tiene 'error()' llama a eso con "Error:" y "warn()" llámalo con "Advertencia:" pero todo es semántica. –

+0

¡hora de aprender sobre funciones variadic! Esta respuesta despejó las cosas, gracias. –

13

Usted nunca querrá usar vprintf() directamente, pero es increíblemente útil cuando necesita, por ej. envolver printf(). Para estos casos, definirá la función de nivel superior con argumentos variables (...). Luego, los recopilará en un va_list, realice su procesamiento y, finalmente, llame al vprintf() en el va_list para obtener la impresión.

Cuestiones relacionadas