我正在编写的小 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
理想情况下,如果我传递给的字符串实际上不是文字,我仍然会收到警告,但我不确定这是否可能。