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!

2

2 Answers

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.

5

The previous solution is ok but has two bugs:

  1. The function va_copy has one parameter instead of two parameters.
  2. The call to function 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; } 
2

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy