可变参数损坏/空的原因

Cause of Variadic Arguments being corrupted/null

本文关键字:变参 参数 损坏      更新时间:2023-10-16

我有一个包装函数,它允许我通过编写一行代码而不是 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("%dn"), 1); // outputs: -858993460
output(_T("%dn"), 2); // outputs: -858993460

此错误的原因是什么,如何解决?

根据C++标准 [support.runtime],在讨论要va_start的第二个参数时:

参数 parmN 是函数定义的变量参数列表中最右侧参数的标识符(紧... 之前的参数)。如果参数 parmN 属于引用类型,或者与传递没有参数的参数时生成的类型不兼容的类型,则行为是未定义的

强调我的。format参数是引用类型,因此将其用作...之前的最后一个参数会导致未定义的行为。