Замена для MS _vscprintf на MacOS / Linux? - PullRequest
15 голосов
/ 24 января 2011

Как опыт обучения, я портирую некоторые вещи из 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 ]

19 голосов
/ 24 января 2011

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

14 голосов
/ 30 октября 2013

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

  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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...