【发布时间】:2009-08-13 11:43:45
【问题描述】:
我有一个类非静态成员函数,它有可变参数,我在 Visual Studio 2005 上编译,带有 64 位运行时,在 64 位 Windows 上。
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 不应该总是在堆栈上吗?
根据most references,我应该只有一个干净的堆栈,里面装满了传递的参数。
我的问题是:这是正确的行为,还是错误?如果是错误,是我的错误还是微软的?
我有定义WIN64和_M_AMD64,WIN32是未定义的。
【问题讨论】:
标签: visual-studio stack 64-bit win64 variadic-functions