编译错误的含义:错误 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_start
、va_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 内在函数只允许在可变参数中使用?的主要内容,如果未能解决你的问题,请参考以下文章
Swift 编译器错误:“无法使用 '((_) -> _)' 类型的参数列表调用 'map'”