我有这样的事情:
static void
my_varargs_internal (const char *prefix, const char *format, va_list args)
{
printf ("%s: ", prefix);
vprintf (format, args);
/* Other more complicated stuff which is why I want this to be a separate function */
printf ("\n");
}
void
__attribute__ ((format (printf, 1, 2)))
varargs_general (const char *format, ...)
{
va_list args;
va_start (args, format);
my_varargs_internal ("General", format, args);
va_end (args);
}
void
__attribute__ ((format (printf, 2, 3)))
varargs_specialized (const char *prefix, const char *format, ...)
{
va_list args;
va_start (args, format);
my_varargs_internal (prefix, format, args);
va_end (args);
}
使用Clang与-Wformat -Wformat-nonliteral
进行编译,我在vprintf
行上收到“Format string is a string literal”警告。有没有办法将format
参数标记为已经检查过的格式字符串,因为编译器已在调用varargs_general
或varargs_specialized
时检查过它?我无法使用format
属性执行此操作,因为这仅适用于varargs函数,而不适用于va_list
参数的函数。
海湾合作委员会似乎正确理解了这种情况,并没有发出警告。
答案 0 :(得分:1)
我能够使用:
来抑制警告static void
__attribute__ ((format (printf, 2, 0)))
my_varargs_internal (const char *prefix, const char *format, va_list args)
{
printf ("%s: ", prefix);
vprintf (format, args);
/* Other more complicated stuff which is why I want this to be a separate function */
printf ("\n");
}
基于Declaring Attributes of Functions:
对于无法检查参数的函数 (例如vprintf),将第三个参数指定为零。