使用c ++强制转换运算符在windows消息中发送float的最佳方法是什么?
我问的原因是我首先遇到的方法不起作用。为了记录,我使用标准的win32函数发送消息:
PostWindowMessage(UINT nMsg, WPARAM wParam, LPARAM lParam)
什么行不通:
static_cast<WPARAM>()
不起作用,因为WPARAM
的类型定义为UINT_PTR
,并且将执行从float到int的数值转换,从而有效地截断float的值。
reinterpret_cast<WPARAM>()
不起作用,因为它用于指针并且因编译错误而失败。
我现在可以想到两个解决方法:
reinterpret_cast
与运算符的地址结合使用:
float f = 42.0f; ::PostWindowMessage(WM_SOME_MESSAGE, *reinterpret_cast<WPARAM*>(&f), 0);
union { WPARAM wParam, float f }; f = 42.0f; ::PostWindowMessage(WM_SOME_MESSAGE, wParam, 0);
其中哪些是优先考虑的?还有其他更优雅的方法来实现这个目标吗?
答案 0 :(得分:3)
使用reinterpret_cast< WPARAM &>(f)
。此强制转换不仅限于指针,它也适用于引用。
答案 1 :(得分:2)
您可以使用memcpy:
#include <memory.h>
int main() {
float f = 1.0;
int n;
memcpy( &n, &f, sizeof(f) );
}
我认为没有一个优雅的解决方案,但无论你做什么,我都会把它包装在一个函数中,以明确我的目标:
int FloatToInt( float f ) {
int n;
assert( sizeof(n) == sizeof(f) );
memcpy( &n, &f, sizeof(f) );
return n;
}
答案 2 :(得分:0)
我更喜欢工会。这是最清楚,最容易理解的。它也可能具有最少量的未定义行为。
答案 3 :(得分:0)
我会采用一种简单的方法来获取指向float
的指针,将其转换为指向UINT
的指针,然后取消引用结果指针:
WPARAM wParam = *((UINT*)(&f));
要将其转换回来,你会做相反的事情。在指针级执行强制转换可确保编译器不会尝试在您的背后进行任何“转换”。
float f = *((float*)(&wParam))