As a learning experience I'm porting some stuff from Windows to MacOS and came across something like this:
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]);
...
}
Now, as _vscprintf is Microsoft specific and I haven't found anything similar on Linux I thought I'd ask here.
Let's also assume this code is in some critical path and shouldn't have some extra overhead of heap allocation or such.
What is the recommended replacement for _vscprintf on MacOS/Linux?
Thanks!
You can use vsnprintf
instead;
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;
}
Thanks to @dbasic for the more complete solution and @j-a for fixing the obvious errors.
The previous solution is ok but has two bugs:
va_copy
has one parameter instead of two parameters.vsnprintf
doesn't use the argcopy
variable; it generates a corruption in the stack if you call vsnprintf
again then.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;
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With