我想编写一个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 *作为输入
最佳答案
您需要将wvsprintf
与va_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/