将此 c-cast 更改为reinterpret_cast 是否安全?

2024-04-23

我正在尝试从我正在处理的某些代码中删除 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(使用前将#替换为@)

将此 c-cast 更改为reinterpret_cast 是否安全? 的相关文章

随机推荐