在不使用va_list的情况下在参数C ++中传递多个参数

时间:2014-05-21 14:07:18

标签: c++ printf c++03 args variadic-functions

我的函数格式如下:

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;
}

1 个答案:

答案 0 :(得分:2)

更改format()的签名。然后使用va_copy宏制作va_listformat()的副本,这样您就可以在每个副本上调用va_start一次。