Замена для 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 за исправление очевидных ошибок.

Предыдущее решение в порядке, но имеет две ошибки:

  1. Функция va_copy имеет один параметр вместо двух параметров.
  2. Призыв к функции 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;
}
Другие вопросы по тегам