c++ - 在 MFC 中正确使用 static_cast

标签 c++ static-cast

更改此代码很简单:

这:

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)&cds .那么对此有什么更新的概念(与 static_cast 一致)?

最佳答案

在您的第一个代码片段中,lpData COPYDATASTRUCT 的成员是 void*输入,所以你可以static_cast它指向(几乎)任何其他数据类型的指针。但是,您不能使用 static_cast在指针( &cds )和非指针( LPARAM )类型之间进行转换。您需要reinterpret_cast (但只有一个):

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

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

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

关于c++ - 在 MFC 中正确使用 static_cast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61732643/

相关文章:

android - 让 c++ 项目在 android 中工作的完整过程是什么

c++ - 基本类型的 static_cast<T> 与 T(n)

c++ - 在将 void* 转换为任何内容时,我应该使用 static_cast 还是 reinterpret_cast

c++ - 使用 Static_Cast 派生类指针指向基类对象

c++ - 如何模拟谷歌模拟中的常量?

c++ - 如何将 std::to_string 函数的预填充归零?

c++ - 检查/列出C++中的所有bash命令?

c++ - 来自抽象类的 unique_ptr 的 shared_ptr

c++ - 尽管有切片,为什么 static_cast 仍然可以使用空指针?

c++ - 带有不相关类的 static_cast