我正在尝试从我正在处理的某些代码中删除 c 风格的强制转换,并且我对唯一的替代方案感到担忧。
原来的代码是:
WPARAM param = (WPARAM)(GetDlgItem(IDC_WORKFLOW).m_hWnd);
this->PostMessage(WM_NEXTDLGCTL, param, TRUE);
如果我使用静态转换:
WPARAM param = static_cast<WPARAM>(GetDlgItem(IDC_WORKFLOW).m_hWnd);
this->PostMessage(WM_NEXTDLGCTL, param, TRUE);
我收到错误“static_cast”:无法从“HWND”转换为“WPARAM”,因为基础类型之间没有有效的转换。这给我留下了“魔鬼的选择”:
WPARAM param = reinterpret_cast<WPARAM>(GetDlgItem(IDC_WORKFLOW).m_hWnd);
this->PostMessage(WM_NEXTDLGCTL, param, TRUE);
据我了解,如果 static_cast 是不可能的,并且这与 constness 无关,则 C-cast 无论如何都必须执行 reinterpret_cast,这意味着底层代码必须进行强制转换,这意味着这是安全的 http://msdn.microsoft.com/en-us/library/e0w9f63b.aspx(备注中的第3点)。但我想在更改代码之前确认这一点。
在这种特定情况下,这种转换安全吗?我如何确认这一点?如果不是,还有什么替代方案?
这是安全的,因为WPARAM
定义为:
typedef UINT_PTR WPARAM;
_PTR 后缀意味着该类型足够大以容纳指针。
而 HWND 是:
typedef HANDLE HWND;
其中句柄是:
typedef void *HANDLE;
所以 void* 和 UINT_PTR 的大小始终相同。如果您将其存储在 64 位应用程序中并尝试在 32 位应用程序中读取,那么您就会遇到麻烦。
如果您仍然担心执行此类转换是否安全,您可以搜索 Visual Studio 源代码(在 C:\Program Files (x86)\Microsoft Visual Studio 8\ 文件夹中),您会发现很多行reinterpret_cast<LPARAM>(...)
and reinterpret_cast<WPARAM>(...)
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)