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 ()
. Новый вариант которого не сломан, так что я хотел бы еще их увидеть.