-Wformat-nonliteral和string常量

时间:2015-01-12 14:16:03

标签: c gcc printf compiler-warnings string-literals

在我们的代码中,我们调用了类似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调用?

0 个答案:

没有答案