我有一个包装函数,它允许我通过编写一行代码而不是3来实现sprintf
的结果。
void output(const tstring& format, ...)
{
va_list args;
va_start(args, format);
const int len = _vsctprintf(format.c_str(), args) + 1;
TCHAR* buf = new TCHAR[len];
_vstprintf(buf, format.c_str(), args);
OutputDebugString(buf);
delete[] buf;
}
我的问题:可变参数已损坏。
例如;
output(_T("%d\n"), 1); // outputs: -858993460
output(_T("%d\n"), 2); // outputs: -858993460
这个错误的原因是什么,我该如何解决?
答案 0 :(得分:4)
根据C ++标准 [support.runtime] ,在讨论va_start
的第二个参数时:
参数 parmN 是函数定义的变量参数列表中最右边的参数的标识符(
...
之前的参数)。 如果参数 parmN 属于引用类型,或者类型与传递没有参数的参数时产生的类型不兼容,则 >行为未确定。
强调我的。您的format
参数是引用类型,因此它用作...
之前的最后一个参数导致未定义的行为。