使用__attribute __((格式(printf,

时间:2014-04-11 13:19:45

标签: c++ gcc attributes format clang

我正在尝试压制-Wformat-nonliteral警告。我使用了属性((格式(printf在其他地方取得了成功,但下面的例子让我不知所措。

exceptions.hpp

class Exceptions {
  ...

  static void fthrow(Thread* thread, const char* file, int line, Symbol* name,
                     const char* format, ...);
};

exceptions.cpp

__attribute__((format(printf, 5, 6)))
void Exceptions::fthrow(Thread* thread, const char* file, int line, Symbol* h_name, const char* format, ...) {
  const int max_msg_size = 1024;
  va_list ap;
  va_start(ap, format);
  char msg[max_msg_size];
  vsnprintf(msg, max_msg_size, format, ap);
  msg[max_msg_size-1] = '\0';
  va_end(ap);
  _throw_msg(thread, file, line, h_name, msg);
}

结果

exceptions.cpp:229:16: error: format argument not a string type
__attribute__((format(printf, 5, 6)))
               ^              ~
exceptions.cpp:235:32: error: format string is not a string literal [-Werror,-Wformat-nonliteral]
  vsnprintf(msg, max_msg_size, format, ap);
                               ^~~~~~

因为它是一个静态的,所以应该使用精确的索引,但是我尝试了4,5和6,7(如果一个一个),类似的失败。

1 个答案:

答案 0 :(得分:0)

应该在函数的声明上设置属性,而不是定义。

class Exceptions {
  ...

  static void fthrow(Thread* thread, const char* file, int line, Symbol* name,
                     const char* format, ...) __attribute__((format(printf, 5, 6)));
};