在c++的形参中传递多个参数而不使用va_list



我有一个函数格式,如:

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一次。

相关内容

  • 没有找到相关文章

最新更新