在 MFC 中正确使用 static_cast
Using static_cast correctly in MFC
更改此代码非常简单:
这个:
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
内联)是什么?
在您的第一个代码片段中,COPYDATASTRUCT
的 lpData
成员是 void*
类型,因此您可以 static_cast
它指向(几乎)任何其他数据类型。但是,您不能使用 static_cast
在指针 (&cds
) 和非指针 (LPARAM
) 类型之间进行转换。您需要 reinterpret_cast
(但只有一个):
if (SendMessageTimeout(hOtherInstance, WM_COPYDATA,
NULL, reinterpret_cast<LPARAM>(&cds), SMTO_BLOCK, 2000, &dwResult) != 0)
尽管 'purist' C++ 程序员经常不赞成此类强制转换,但实际上没有其他方法可以避免它们,除了您的 'old'代码已经有了。这是因为 WinAPI 是作为 C 接口编写的,所以它在更现代的 C++ 代码中的使用不可避免地会有一些这样的 'inconsistencies'.
(当使用涉及函数指针的 WinAPI 调用时,问题变得更加棘手,正如我在这里思考的那样:What’s the best way to cast a function pointer from one type to another?。)
更改此代码非常简单:
这个:
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
内联)是什么?
在您的第一个代码片段中,COPYDATASTRUCT
的 lpData
成员是 void*
类型,因此您可以 static_cast
它指向(几乎)任何其他数据类型。但是,您不能使用 static_cast
在指针 (&cds
) 和非指针 (LPARAM
) 类型之间进行转换。您需要 reinterpret_cast
(但只有一个):
if (SendMessageTimeout(hOtherInstance, WM_COPYDATA,
NULL, reinterpret_cast<LPARAM>(&cds), SMTO_BLOCK, 2000, &dwResult) != 0)
尽管 'purist' C++ 程序员经常不赞成此类强制转换,但实际上没有其他方法可以避免它们,除了您的 'old'代码已经有了。这是因为 WinAPI 是作为 C 接口编写的,所以它在更现代的 C++ 代码中的使用不可避免地会有一些这样的 'inconsistencies'.
(当使用涉及函数指针的 WinAPI 调用时,问题变得更加棘手,正如我在这里思考的那样:What’s the best way to cast a function pointer from one type to another?。)