我有一个函数格式,如:
std::string format(const char* szFormat,...)
{
std::string stringResult;
char c;
va_list args;
va_start(args, szFormat);
//we estimate the size to malloc
int nSize = vsnprintf(&c, 1, szFormat, args);
va_end(args);
char *str = (char *)malloc(sizeof(char) * (nSize + 1));
//we must make va_start again otherwize vsnprintf won't work
va_list args2;
va_start(args2, szFormat);
vsnprintf(str, nSize + 1, szFormat, args2);
va_end (args2);
std::string result(str);
free(str);
return result;
}
我有一个函数显示,如:
std::string display(const char* szFormat,...)
{
}
必须调用format()。
我不能在display()函数中设置va_start并通过
更改format函数的签名std::string format(const char * szFormat, va_list &arg_ptr)
因为我的format命令必须多次运行va_start。
(一次估计目标字符串的长度,一次创建实际字符串)。
你有主意了吗?
EDIT:
对于那些想要完整功能解决方案的人,感谢Brian:
static std::string format(const char * szFormat, va_list &arg_ptr)
{
std::string stringResult;
char c;
va_list args2;
va_copy(args2, arg_ptr);
int nSize = vsnprintf(&c, 1, szFormat, arg_ptr);
char *str = (char *)malloc(sizeof(char) * (nSize + 1));
vsnprintf(str, nSize + 1, szFormat, args2);
std::string result(str);
free(str);
return result;
}
static std::string format(const char * szFormat,...)
{
va_list args;
va_start(args, szFormat);
std::string result = format(szFormat, args);
va_end(args);
return result;
}
修改format()
的签名。然后使用va_copy
宏来复制format()
中的va_list
,这样您就可以在每个副本上调用va_start
一次。