我正在做的一个项目和一些 MSDN documentation 有这样的代码:
IFileOpenDialog *pFileOpen;
IID_PPV_ARGS(&pFileOpen)
其中 IID_PPV_ARGS 是:
#define IID_PPV_ARGS(ppType) __uuidof(**(ppType)), IID_PPV_ARGS_Helper(ppType)
我的问题是关于
**(ppType)
部分。这不会最终取消引用空指针或未初始化的指针吗?为什么这样做? 最佳答案
__uuidof()
是专有的 Microsoft 扩展,编译器知道如何处理。它在编译时评估,而不是在运行时评估。
编译器尝试查找并替换给定接口(interface)的 UUID。该接口(interface)使用 __declspec(uuid("..."))
扩展声明其 UUID。如果编译器找不到 UUID,则构建将失败。在运行时实际上没有指针被取消引用。ppType
设置为 IFileOpenDialog**
,因此 *(ppType)
是 IFileOpenDialog*
, **(ppType)
是 IFileOpenDialog
。因此,__uuidof(**(ppType))
在编译时被评估为 __uuidof(IFileOpenDialog)
。
这与执行此操作相同:
char* ptr = nullptr;
size_t charSize = sizeof(*ptr);
sizeof(*ptr)
将在编译时评估为 sizeof(char)
,即使 ptr
为空。关于c++ - IID_PPV_ARGS 和取消引用 NULL,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29379120/