IID_PPV_ARGS和取消引用NULL
IID_PPV_ARGS and Dereferencing NULL
我正在处理的一个项目和一些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
相关文章:
- 在这个函数中是有缺陷的,因为取消引用 null 是无效的,所以我想更改代码
- 如何在C++中返回Null作为引用
- 如何引用 obj1 并在 NULL 时调用 show 方法
- 排序时引用绑定到 'value_type' 类型的 null 指针
- 取消引用会导致崩溃,即使对于非 NULL 指针也是如此,原因也是如此
- 如果 null 不是有效值,则使参数成为引用而不是指针
- 我可以根据null或特定类型的值检查引用吗
- 指针引用const null值
- 引用绑定到类型 'struct value_type' 的 null 指针
- 为什么我们需要在move构造函数中将右值引用设置为null
- 检查指针是否为null,然后在同一if语句中取消引用它,这样安全吗
- 如果指针设置为 NULL,则对它的任何引用都不会或通过它也是 NULL
- cppcheck null指针取消引用:m_buffer-否则,针对null进行检查是多余的
- 引用地址如何在C++变为 NULL
- 自定义 std::shared_ptr 或 boost::shared_ptr 以在 NULL 取消引用时引发异常
- IID_PPV_ARGS和取消引用NULL
- 通过解引用NULL指针来赋值引用
- 取消引用 NULL 指针是否保证在 C/C++ 中使程序崩溃
- 在c++中解引用NULL指针
- clang++ 4.1,在解引用NULL时没有崩溃