私が書いている小さな C ライブラリには、エラー報告機能があります。errorf
単純なerror
関数に加えて、エラー メッセージに簡単に情報を埋め込むことができる関数を提供したいと考えています。
/*
* 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);
}
-Weverything
問題は、次の警告が表示されることです (スイッチを使用して clang 4.0 でコンパイル):
警告: フォーマット文字列は文字列リテラルではありません
なぜこれを行うのが悪いのか理解しています。この警告を取り除く方法はありますか? 引数が常に文字列リテラルであることをコンパイラが認識できるように、format
引数を文字列リテラルにすることはできますか?sio_errorf
を使用できることはわかっています-Wno-format-nonliteral
が、他の人が手動でコンパイルする場合にのみ、そうしません。警告を黙らせるソースコードの何かが欲しいです。
理想的には、渡した文字列がsio_errorf
実際にリテラルでない場合でも警告が表示されますが、それが可能かどうかはわかりません。