我正在做的一个项目和一些 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/

10-11 16:10