【问题标题】:Using static_cast correctly in MFC在 MFC 中正确使用 static_cast
【发布时间】:2020-05-11 14:51:41
【问题描述】:

更改此代码很简单:

这个:

S_COPY_PACKET* pCopyPacket = (S_COPY_PACKET*)(pCopyDataStruct->lpData);

变成:

S_COPY_PACKET* pCopyPacket = static_cast<S_COPY_PACKET*>(pCopyDataStruct->lpData);

但是这条线呢:

if (SendMessageTimeout(hOtherInstance, WM_COPYDATA,
                NULL, (LPARAM)(LPVOID)&cds, SMTO_BLOCK, 2000, &dwResult) != 0)

我们正在传递(LPARAM)(LPVOID)&amp;cds。那么对此有什么新概念(与static_cast 内联)?

【问题讨论】:

  • cds是什么类型?
  • @bolov 是COPYDATASTRUCT
  • 我的回答是错误的。带有static_cast 的代码无法编译。
  • @bolov 哦,好的!谢谢你告诉我。

标签: c++ static-cast


【解决方案1】:

在您的第一个代码 sn-p 中,COPYDATASTRUCTlpData 成员是 void* 类型,因此您可以 static_cast 它指向(几乎)任何其他数据类型的指针。但是,您不能使用 static_cast 在指针 (&amp;cds) 和非指针 (LPARAM) 类型之间进行转换。你需要reinterpret_cast(但只有一个):

if (SendMessageTimeout(hOtherInstance, WM_COPYDATA,
                NULL, reinterpret_cast<LPARAM>(&cds), SMTO_BLOCK, 2000, &dwResult) != 0)

尽管“纯粹”C++ 程序员经常不赞成这种转换,但实际上没有其他方法可以避免它们,除了“旧”代码已经拥有的更糟糕的“C 风格”转换.这是因为 WinAPI 是作为 C 接口编写的,因此在更现代的 C++ 代码中使用它不可避免地会出现一些这样的“不一致”。

(当使用涉及函数指针的 WinAPI 调用时,问题变得更加棘手,正如我在这里思考的那样:What’s the best way to cast a function pointer from one type to another?。)

【讨论】:

  • reinterpret_cast&lt;LPARAM&gt;(&amp;&lt;something&gt;) 经常出现在涉及 Windows 消息的 WinAPI 调用中,其中 lParam 参数(必然)是指向某物的指针。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多