我的函数格式如下:
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并通过
更改格式函数的签名std::string format(const char * szFormat, va_list &arg_ptr)
因为我的格式化命令必须多次运行va_start。
(一次估计目标字符串的长度,一次创建真正的字符串)。
你有个主意吗?
编辑:
对于那些想要完全功能解决方案的人,感谢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;
}
答案 0 :(得分:2)
更改format()
的签名。然后使用va_copy
宏制作va_list
中format()
的副本,这样您就可以在每个副本上调用va_start
一次。