Следующий код выдает предупреждение о неверном спецификаторе формата во всех основных компиляторах
std::wstring ws = L"some example string";
char buff[100];
sprintf(buff, "%s", ws.c_str());
Предупреждение исчезает, если мы используем его в контексте 'variadic' (шаблон variadic или va_list).
std::wstring ws = L"some example string";
void foo_va_list(const char* fmt, ...)
{
va_list argv;
va_start( argv, fmt );
char buff[1000];
vsprintf(buff, fmt, argv);
va_end(argv);
}
template<typename ... T>
void foo_variadic_template(const char* fmt, T && ... args)
{
char buff[100];
sprintf(buff, fmt, args...);
}
int main()
{
//this two should produce a warning but don't
foo_va_list("foo_va_list %s", ws.c_str());
foo_variadic_template("foo_variadic_template %s", ws.c_str());
char buff[100];
//this one produces warning as expected
sprintf(buff, "sprintf %s", ws.c_str());
}
Вопрос в том, как включить это предупреждение в этом контексте?