在MFC中正确使用static_cast

问题描述 投票:0回答:1

改这个代码很直接。

This:

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)为这?

c++ static-cast
1个回答
3
投票

在你的第一个代码片段中, 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)

虽然这样的casts经常被 "纯粹的 "C++程序员所反对,但是除了你的 "旧 "代码已经有的更讨厌的 "C-style "casts之外,真的没有其他办法可以避免。这是因为WinAPI是作为C接口编写的,所以它在更现代的C++代码中的使用不可避免地会有一些这样的 "不一致"。

(当使用涉及函数指针的 WinAPI 调用时,这个问题就变得更加棘手了,就像我在这里思考的那样。什么是将一个函数指针从一种类型投向另一种类型的最佳方法?.)

© www.soinside.com 2019 - 2024. All rights reserved.