【发布时间】:2016-10-04 04:29:25
【问题描述】:
我有这样的事情:
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);
}
使用带有-Wformat -Wformat-nonliteral 的Clang 进行编译,我在vprintf 行上收到“格式字符串不是字符串文字”警告。有没有办法将format 参数标记为已检查的格式字符串,因为编译器已经在调用varargs_general 或varargs_specialized 时检查了它?我不能用format 属性来做到这一点,因为它只适用于可变参数函数,而不是带有va_list 参数的函数。
GCC 似乎正确理解了这种情况并且没有发出警告。
【问题讨论】:
标签: c clang compiler-warnings variadic-functions