在MacOS/Linux上替换MS _vscprintf?

mur*_*att 16 c++ string

作为一种学习经历,我将一些东西从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]);
    ...
}
Run Code Online (Sandbox Code Playgroud)

现在,因为_vscprintf是微软特有的,我在Linux上没有发现任何类似的东西,我想我会问这里.

我们还假设此代码位于某个关键路径中,并且不应该有一些额外的堆分配开销等.

在MacOS/Linux上推荐的_vscprintf替代品是什么?

谢谢!

ism*_*ail 20

你可以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; 
   }
Run Code Online (Sandbox Code Playgroud)

感谢@dbasic提供更完整的解决方案,感谢@ja修复明显的错误.

  • 我按以下方式做了:int _vscprintf(const char*format,va_list pargs){int retval; va_list argcopy; va_copy(argcopy); retval = vsnprintf(NULL,0,format,pargs); va_end用来(argcopy); 返回; } (3认同)

小智 14

以前的解决方案还可以,但有两个错误:

  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;
}
Run Code Online (Sandbox Code Playgroud)