我有一个类非静态成员函数,它有可变参数,我在 64 位 Windows 上使用 64 位运行时在 Visual Studio 2005 上编译。
void Class::Foo(void* ptr,...)
{
va_list args;
va_start(args,ptr);
float f=va_arg(args,float);
va_end(args)
}
我期待一个浮点数,我将一个浮点数传递给函数。但是当我调试时 - 我没有得到我通过的浮点数。事实上 - 它被函数作为 64 位双精度接收!我必须这样做:
double d=va_arg(args,double);
float f=(float)d;
现在我知道 Win64 喜欢在寄存器中传递参数,并在这样做时转换浮点数,va_list 不应该总是在堆栈上吗?
根据大多数参考资料,我应该只有一个干净的堆栈,里面装满了传递的参数。
我的问题是:这是正确的行为,还是错误?如果它是一个错误,是我的错误,还是微软的?
我有定义 WIN64 和 _M_AMD64,而 WIN32 是未定义的。