IID_PPV_ARGS和取消引用NULL

IID_PPV_ARGS and Dereferencing NULL

本文关键字:引用 NULL 取消 ARGS PPV IID      更新时间:2023-10-16

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

IFileOpenDialog *pFileOpen;
IID_PPV_ARGS(&pFileOpen)

其中IID_PPV_ARGS为:

#define IID_PPV_ARGS(ppType) __uuidof(**(ppType)), IID_PPV_ARGS_Helper(ppType)

我的问题是关于**(ppType)部分。这不会导致取消引用null或单元化指针吗?为什么这样做?

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

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

ppType被设置为IFileOpenDialog**,因此*(ppType)IFileOpenDialog*,而**(ppType)IFileOpenDialog。因此,__uuidof(**(ppType))在编译时被评估为__uuidof(IFileOpenDialog)

这和做这个是一样的:

char* ptr = nullptr;
size_t charSize = sizeof(*ptr);

即使ptr为null,sizeof(*ptr)在编译时也将被评估为sizeof(char)

Jonathan的回答还有一点(因为我的声誉太低,所以我不能留下评论):

在调试构建中,__uuidof始终动态初始化对象(在运行时)。在发布版本中,__uuidof可以静态地(在编译时)初始化对象。

请参阅:https://learn.microsoft.com/en-us/cpp/cpp/uuidof-operator?view=msvc-160