【发布时间】:2011-01-30 17:20:58
【问题描述】:
使用 c++ 强制转换运算符在 windows 消息中发送浮点数的最佳方式是什么?
我问的原因是我首先想到的方法不起作用。作为记录,我使用标准的 win32 函数发送消息:
PostWindowMessage(UINT nMsg,WPARAM wParam,LPARAM lParam)什么不起作用:
-
使用
static_cast<WPARAM>()不起作用,因为WPARAM被typedef'ed 为UINT_PTR并将进行从float 到int 的数字转换,有效地截断float 的值。 -
使用
reinterpret_cast<WPARAM>()不起作用,因为它是为指针使用而失败并出现编译错误。
目前我能想到两种解决方法:
-
将
reinterpret_cast与运算符的地址结合使用: 浮动 f = 42.0f; ::PostWindowMessage(WM_SOME_MESSAGE, *reinterpret_cast(&f), 0); - 使用联合: 联合 { WPARAM wParam,浮动 f }; f = 42.0f; ::PostWindowMessage(WM_SOME_MESSAGE, wParam, 0);
其中哪些是首选?还有其他更优雅的方式来实现这一点吗?
【问题讨论】:
-
我不建议通过称为“PostWindowMessage”的东西向临时对象发送指针,因为它应该是异步的。
-
指针在调用时被取消引用(演员前的星号),没有临时地址发送到 PostWindowMessage
-
@Kirill 我不会向临时人员发送指针。我正在获取浮点数的地址,将该地址转换为指向 WPARAM 的指针,并将该地址解析为按值传递的 WPARAM。指针仅用于欺骗编译器不转换值。
-
@Vincent Robert,好的,我现在看到了。