【发布时间】:2014-03-12 06:57:32
【问题描述】:
我正在尝试从我正在处理的一些代码中删除 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,这意味着基础代码必须回滚,which means this is safe(点3 备注)。但我想在更改代码之前确认这一点。
在这种特定情况下这种演员阵容是否安全,我该如何确认?如果没有,有什么替代方案?
【问题讨论】:
-
是的,它是安全的,但是您可以继续使用 Windows API / MFC 代码中常见的 C 样式转换,并且 IMO 更易于阅读。
-
与将整数类型转换为
void *一样安全。 -
@MichaelFoukarakis WPARAM 保证和指针的宽度一样,所以这里没问题
-
@dsi 我不喜欢使用 C 样式,因为它隐藏了您正在做的坏事,但感谢您指出这是我正在使用的代码库中的常见模式。
-
@dsi 顺便说一句,你能回答一下吗?如果没有比这更好的了,对于任何搜索此类问题的人来说,这将是“足够好”。
标签: c++ winapi casting reinterpret-cast