IID_PPV_ARGS 和解除引用 NULL

Jef*_*f M 3 c++ msdn visual-studio

我正在做的一个项目和一些MSDN 文档有这样的代码:

IFileOpenDialog *pFileOpen;
IID_PPV_ARGS(&pFileOpen)
Run Code Online (Sandbox Code Playgroud)

其中 IID_PPV_ARGS 是:

#define IID_PPV_ARGS(ppType) __uuidof(**(ppType)), IID_PPV_ARGS_Helper(ppType)
Run Code Online (Sandbox Code Playgroud)

我的问题是关于**(ppType)部分的。这不会最终取消引用空指针或未初始化的指针吗?为什么这样做?

Jon*_*ter 7

__uuidof()是专有的 Microsoft 扩展,编译器知道如何处理。它在编译时评估,而不是在运行时评估。

编译器尝试查找并替换给定接口的 UUID。接口使用__declspec(uuid("..."))扩展名声明其 UUID 。如果编译器找不到 UUID,则构建将失败。在运行时实际上没有指针被取消引用。

ppType被设置为 a IFileOpenDialog**,因此*(ppType)是 aIFileOpenDialog*并且**(ppType)是 a IFileOpenDialog。因此,在编译时__uuidof(**(ppType))进行评估__uuidof(IFileOpenDialog)

这与执行此操作相同:

char* ptr = nullptr;
size_t charSize = sizeof(*ptr);
Run Code Online (Sandbox Code Playgroud)

sizeof(*ptr)sizeof(char)在编译时评估,即使ptr为空。