在我们的代码中,我们调用了类似printf的函数,其中格式字符串来自命名文字:
static const char fmt[] = "File read error at %08X";
[...]
qsnprintf(errmsg, sizeof(errmsg), fmt, file_offset);
使用-Wformat=2
会产生警告:
“警告:格式不是字符串文字,未选中参数类型[-Wformat-nonliteral]”
虽然我不太明白原始代码的问题是什么,但我能够像这样“修复”它:
static const char * const fmt = "File read error at %08X";
但是,在少数情况下,我们有一个格式字符串数组,例如:
static const char *const rmsg[] =
{
NULL,
"Unknown relocation type 0x%X for symbol \"%s\"",
"Unimplemented relocation type 0x%X for symbol \"%s\"",
"Untested relocation type 0x%X for symbol \"%s\"",
"Relocation to invalid symbol",
};
qsnprintf(relerr, sizeof(relerr), rmsg[errnum], type, sym_name);
这会产生同样的警告,但我无法找到让GCC满意的方法。我是否必须将其转换为交换机和几个qsnprintf调用?