作为一种学习经历,我将一些东西从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修复明显的错误.
小智 14
以前的解决方案还可以,但有两个错误:
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;
}
Run Code Online (Sandbox Code Playgroud)