Tengo una funcionalidad de informe de errores en mi pequeña biblioteca de C que estoy escribiendo. Deseo proporcionar una función errorf
además de la función simple error
para permitir la incrustación de información en mensajes de error fácilmente.Evitar advertencias en el contenedor de printf
/*
* Prints a formatted error message. Use it as you would use 'printf'. See the
* 'sio_error' function.
*/
void sio_errorf(const char *format, ...) {
// Print the error prefix
if (g_input == STDIN) fputs("error: ", stderr);
else fprintf(stderr, "%s: ", g_progname);
// Pass on the varargs on to 'vfprintf'.
va_list arglist;
va_start(arglist, format);
// This may produce the following warning -- ignore it:
// warning: format string is not a string literal
vfprintf(stderr, format, arglist);
va_end(arglist);
fputc('\n', stderr);
}
El problema es, consigo esta advertencia (Compilación con sonido metálico 4.0 con el interruptor -Weverything
):
advertencia: cadena de formato no es una cadena literal
entiendo por qué hacer esto sería malo. ¿Hay alguna forma de que pueda deshacerme de esta advertencia? ¿Puedo de alguna manera exigir que el argumento format
sio_errorf
sea un literal de cadena, para que el compilador sepa que siempre lo estará y que simplemente lo estoy transmitiendo?
Sé que puedo usar -Wno-format-nonliteral
, pero solo si otras personas van a compilarlo manualmente también, no lo harán. Prefiero algo en el código fuente que silencie la advertencia.
Idealmente aún recibiría la advertencia si la secuencia que pasé a sio_errorf
en realidad no es literal, pero no estoy seguro si eso es posible.
Qué compilador, y qué versión, está usando? –
Clang ('-v' me dice" Apple clang versión 4.0 "), aunque estoy bastante seguro de que gcc da la misma advertencia. – mk12