Visual Studio 2005 中的 x64 va_list
我有一个类非静态成员函数,它有可变参数,我在 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 未定义。
I have a class non-static member function, and it has variable arguments, I'm compiling on Visual Studio 2005, with the 64-bit runtime, on 64-bit Windows.
void Class::Foo(void* ptr,...)
{
va_list args;
va_start(args,ptr);
float f=va_arg(args,float);
va_end(args)
}
I'm expecting a float, I pass a float to the function. But when I debug - I don't get the float I've passed. In fact - it's being received by the function as a 64-bit double! I have to do this:
double d=va_arg(args,double);
float f=(float)d;
Now I know Win64 likes to pass parameters in registers, and casts floats when it does this, shouldn't a va_list always be on the stack?
According to most references, I should have just a clean stack full of the passed parameters.
My question is: is this correct behaviour, or a bug? And if it's a bug, is it my bug, or Microsoft's?
I have the defines WIN64 and _M_AMD64, and WIN32 is undefined.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我这里没有C++标准,但在这件事上它遵循C标准。 C99,6.5.2.2p7 说
因此,对于您的浮点参数,将执行“默认参数升级”。
这些在 p6 中定义为
因此,所有浮点数在传递给椭圆时都会转换为双精度。 VS 显然在这方面符合要求,并且错误存在于您的代码中,该代码不应在
va_arg
中使用float
。I don't have the C++ standard here, but it follows the C standard in this matter. C99, 6.5.2.2p7 says
So for your float argument, "default argument promotions" are performed.
These are defined in p6 as
So all floats are converted to double when being passed to an ellipse. VS apparently conforms in this respect, and the bug is in your code, which shouldn't use
float
inva_arg
.看起来这是一个 VC++ x64 bug。
修复:va_arg 函数在 Visual C++ 2005 应用程序中返回不正确的值
Looks like it is a VC++ x64 bug.
FIX: The va_arg function returns an incorrect value in a Visual C++ 2005 application