4

我正在使用 VS2010 Pro 编译器,当我在 x64 上构建时,我得到以下编译错误。在 x86 上完美编译。错误 C2704: '' : __va_start 只允许在可变参数中使用

方法声明:

int foo(char* buf, int maxChar, const char*& fmt);

定义:

 int foo(char* buf, int maxChar, const char*& fmt)
{
    int numChar = 0;
    if (fmt)
    {
        va_list plist;
        va_start(plist, fmt);
        numChar = _vsnprintf(buf, maxChar, fmt, plist);
        va_end(plist);
    }
    return numChar;
}

错误的含义是什么?如何解决这个问题?

4

3 回答 3

7

我认为这几乎就是它所说的意思。编译器不允许您使用va_start,va_arg等,除非在可变参数函数中。在 vararg 函数之外使用va_start是没有意义的。

这没有定义可变参数函数:

int foo(char* buf, int maxChar, const char*& fmt)

这样做:

int foo(char* buf, int maxChar, const char*& fmt, ...)
于 2013-10-11T20:25:51.623 回答
3

在 x86 上,所有参数都在堆栈上传递,使用va_start和朋友获取“参数”在语义上是安全的(尽管不正确)。

但是,在 amd64 上(很可能在 ARM 上),一些参数是通过 registers 传递的。在这种情况下,va_start在未声明为采用可变参数的函数中使用在语义上是不安全的——va_start将索引到无效内存。

于 2013-10-11T23:25:03.373 回答
1

您在具有固定数量参数的函数中使用了可变参数宏;错误的 MSDN 链接

于 2013-10-11T20:26:11.763 回答