我正在处理的项目和一些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指针吗?为什么这样做?
答案 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