编译错误的含义:错误 C2704:__va_start 内在函数只允许在可变参数中使用?

Posted

技术标签:

【中文标题】编译错误的含义:错误 C2704:__va_start 内在函数只允许在可变参数中使用?【英文标题】:Meaning of compilation error : error C2704: __va_start intrinsic only allowed in varargs? 【发布时间】:2013-10-11 20:22:28 【问题描述】:

我正在使用 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;

错误是什么意思?如何解决这个问题?

【问题讨论】:

【参考方案1】:

我认为这与它所说的差不多。编译器不允许您使用va_startva_arg 等,除非在可变参数函数中。在可变参数函数之外使用va_start 没有意义。

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

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

这样做:

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

【讨论】:

谢谢,为什么这不是 x86 编译的问题? @John 这很可能是个问题,你只是没有得到诊断。 我唯一的猜测(为什么在 x86 中没有收到错误消息)是编译器错误。【参考方案2】:

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

但是,在 amd64(很可能是 ARM)上,some arguments are passed via registers。在这种情况下,在未声明为采用可变参数的函数中使用 va_start 在语义上是不安全的 - va_start 会索引到无效内存。

【讨论】:

【参考方案3】:

您在具有固定数量参数的函数中使用了可变参数宏; MSDN link to the error.

【讨论】:

以上是关于编译错误的含义:错误 C2704:__va_start 内在函数只允许在可变参数中使用?的主要内容,如果未能解决你的问题,请参考以下文章

Mac OS X 中的编译错误

编译器错误 __ZTVN13..6..E

使用带有类错误的地图,编译错误

Swift 编译器错误:“无法使用 '((_) -> _)' 类型的参数列表调用 'map'”

“_OBJC_CLASS_$_CATransaction,引用自:”编译时错误是啥意思?

函数指针编译错误