A (очень давно), в то время как я регулярно использовал следующий код - затем на MSVC 6 - для определения памяти, необходимой для форматирования строки для функции с переменными аргументами:
void LogPrint(const char *pszFormat, ...)
{
int nBytes;
char *pszBuffer;
va_list args;
va_start(args, pszFormat);
nBytes = vsnprintf(0, 0, pszFormat, va);
va_end(args);
// error checking omitted for brevity
pszBuffer = new char[nBytes + 1];
va_start(args, pszFormat);
vsnprintf(pszBuffer, nBytes, pszFormat, va);
va_end();
// ...
}
Очевидная ошибкавы получаете более новую версию MSVC (сейчас я использую 2010):
предупреждение C4996: 'vsnprintf': эта функция или переменная может быть небезопасной.Попробуйте вместо этого использовать vsnprintf_s.Чтобы отключить устаревание, используйте _CRT_SECURE_NO_WARNINGS.Для получения подробной информации см. Интерактивную справку.
Я большой поклонник опции "рассматривать предупреждения как ошибки" для любого компилятора C (++), и, очевидно, моя сборка не удалась.Мне кажется обманом просто использовать #pragma warning (disable:4996)
и продолжать его.
Предлагаемая "более безопасная" альтернатива vsnprintf_s()
, однако обречена на возврат -1
при вводевозникают условия его «небезопасного» предшественника.
TL / DR: Есть ли способ реализовать ожидаемое поведение vsnprintf()
для возврата памяти, необходимой для выполнения его задачи, с использованием нового, более безопасные варианты этого?
РЕДАКТИРОВАТЬ: просто определение _CRT_SECURE_NO_WARNINGS
не будет сокращать его;там тоже много strcpy()
летающих.Новый вариант, который не сломан, так что я бы хотел увидеть их.