将指针转换为 LPVOID*
cast pointer to pointer as LPVOID*
我有以下代码:
IShellLink* psl;
HRESULT hres = CoCreateInstance(
CLSID_ShellLink,
NULL,
CLSCTX_INPROC_SERVER,
IID_IShellLink,
(LPVOID*)&psl);
编译正确。但我需要用 *_cast
替换 (LPVOID*)&psl
。我必须使用什么演员表?
static_cast<LPVOID*>(&psl)
生成错误(在 MSVC 2013 中)。
使用 reinterpret_cast<LPVOID*>(&psl)
是否正确?
是的,reinterpret_cast是正确的选择。通常,从 type* 到 void* 的转换应该隐式完成,而从 void* 到 type* 的转换应该使用 static_cast 完成。但在您的情况下,您正在从类型**转换为 void**,这让您别无选择,只能使用 reinterpret_cast。它仍然比 c 风格的转换有点 "safer",因为你不能抛弃 constness。
我认为您可能必须使用 reinterpret_cast,因为 CoCreateInstance 函数的最后一个参数用于输出目的。
看到这个 link:https://msdn.microsoft.com/en-us/library/windows/desktop/ms686615(v=vs.85).aspx
因此,无论您进行 C 风格转换还是使用 reinterpret_cast,函数只是想在堆中创建对象后将指针值放入变量 "psl"。
我有以下代码:
IShellLink* psl;
HRESULT hres = CoCreateInstance(
CLSID_ShellLink,
NULL,
CLSCTX_INPROC_SERVER,
IID_IShellLink,
(LPVOID*)&psl);
编译正确。但我需要用 *_cast
替换 (LPVOID*)&psl
。我必须使用什么演员表?
static_cast<LPVOID*>(&psl)
生成错误(在 MSVC 2013 中)。
使用 reinterpret_cast<LPVOID*>(&psl)
是否正确?
是的,reinterpret_cast是正确的选择。通常,从 type* 到 void* 的转换应该隐式完成,而从 void* 到 type* 的转换应该使用 static_cast 完成。但在您的情况下,您正在从类型**转换为 void**,这让您别无选择,只能使用 reinterpret_cast。它仍然比 c 风格的转换有点 "safer",因为你不能抛弃 constness。
我认为您可能必须使用 reinterpret_cast,因为 CoCreateInstance 函数的最后一个参数用于输出目的。 看到这个 link:https://msdn.microsoft.com/en-us/library/windows/desktop/ms686615(v=vs.85).aspx
因此,无论您进行 C 风格转换还是使用 reinterpret_cast,函数只是想在堆中创建对象后将指针值放入变量 "psl"。