IID_PPV_ARGS和解除引用NULL

时间:2015-03-31 21:44:42

标签: c++ visual-studio msdn

我正在处理的项目和一些MSDN documentation的代码如下:

IFileOpenDialog *pFileOpen;
IID_PPV_ARGS(&pFileOpen)

IID_PPV_ARGS在哪里:

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

我的问题是**(ppType)部分。这最终会取消引用null或unitialized指针吗?为什么这样做?

2 个答案:

答案 0 :(得分:4)

__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);

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

答案 1 :(得分:2)

乔纳森的回答还有一点(因为我的声誉太低,我无法发表评论):

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

见:https://docs.microsoft.com/en-us/cpp/cpp/uuidof-operator?view=msvc-160