Подтвердить что ты не робот

Замена для 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?

Спасибо!

4b9b3361

Ответ 1

Вместо этого вы можете использовать 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 для более полного решения и @j-a для исправления очевидных ошибок.

Ответ 2

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

  • Функция 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;
}