我想编写一个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 *作为输入

最佳答案

您需要将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());
}

关于c++ - 传递可变长度参数列表时遇到麻烦,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28210654/

10-10 11:22