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)部分的。这不会最终取消引用空指针或未初始化的指针吗?为什么这样做?
__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为空。
| 归档时间: |
|
| 查看次数: |
1336 次 |
| 最近记录: |