传递可变长度参数列表的麻烦

时间:2015-01-29 09:04:24

标签: c++

我想编写一个format + args样式函数来创建一个字符串,并在框架中调用一个函数来访问其脚本监听器窗口以进行输出。

功能如下:

void ScriptPrint(wchar_t* format, ...) {
    wchar_t formatted[1024] = {L"\0"};
    va_list args;
    va_start(args, format); 
    wsprintf(formatted, format, args);
    va_end(args);

    std::wstring ret = L"print \"";
    ret += formatted;
    ret += L"\"";

    ExecuteMAXScriptScript(ret.c_str());
}

根据我的理解,它应该有效,但是当我调用这样的函数时:

ScriptPrint(L"this is an integer %i", 10);

我在监听器窗口中得到的输出是"这是一个整数1223523" (数字改变但永远不对。)

我在调试器中检查了它,这正是wsprintf输出的内容。我不确定我是否使用wsprintf错误或va_list ..帮助?

使用的

标题:Windows.h,cstdarg

最终函数也只需要wchar_t *作为输入

1 个答案:

答案 0 :(得分:1)

您需要将wvsprintfva_list一起使用,而不是wsprintf

va_list args;
va_start(args, format); 
wvsprintf(formatted, format, args);
va_end(args);

使用C ++ 11,您可以改为使用wsprintf):

template <typename...Ts>
void ScriptPrint(const wchar_t* format, Ts&&...args) {
    wchar_t formatted[1024] = {0};
    wsprintf(formatted, format, std::forward<Ts>(args)...);

    std::wstring ret = L"print \"";
    ret += formatted;
    ret += L"\"";

    ExecuteMAXScriptScript(ret.c_str());
}