Замена для MS _vscprintf на MacOS/Linux?
Как опыт обучения я портирую некоторые вещи из Windows на MacOS и наткнулся на что-то вроде этого:
void SomeClass::someFunction(const char* format, va_list args)
{
int size = _vscprintf(format, args); // length after formatting
std::string s;
s.resize(size);
vsprintf(&s[0]);
...
}
Теперь, поскольку _vscprintf специфичен для Microsoft, и я не нашел ничего похожего в Linux, я подумал, что спросить здесь.
Давайте также предположим, что этот код находится на некотором критическом пути и не должен иметь дополнительных затрат на выделение кучи или что-то подобное.
Какая рекомендуемая замена для _vscprintf в MacOS/Linux?
Спасибо!
2 ответа
Решение
Ты можешь использовать vsnprintf
вместо;
int _vscprintf (const char * format, va_list pargs) {
int retval;
va_list argcopy;
va_copy(argcopy, pargs);
retval = vsnprintf(NULL, 0, format, argcopy);
va_end(argcopy);
return retval;
}
Спасибо @dbasic за более полное решение и @ja за исправление очевидных ошибок.
Предыдущее решение в порядке, но имеет две ошибки:
- Функция
va_copy
имеет один параметр вместо двух параметров. - Призыв к функции
vsnprintf
не используетargcopy
переменная; это вызывает повреждение в стеке, если вы вызываетеvsnprintf
потом снова.
int _vscprintf (const char * format, va_list pargs)
{
int retval;
va_list argcopy;
va_copy(argcopy, pargs);
retval = vsnprintf(NULL, 0, format, argcopy);
va_end(argcopy);
return retval;
}