传递可变长度参数列表时出现问题

Trouble with passing on variable length argument list

本文关键字:列表 问题 参数      更新时间:2023-10-16

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

函数如下:

void ScriptPrint(wchar_t* format, ...) {
    wchar_t formatted[1024] = {L""};
    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());
}