2015-03-31 21 views
0

一個項目我正在和一些MSDN documentation具有如下代碼:IID_PPV_ARGS和非關聯化NULL

IFileOpenDialog *pFileOpen; 
IID_PPV_ARGS(&pFileOpen) 

其中IID_PPV_ARGS是:

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

我的問題是關於**(ppType)部分。這不會最終取消引用空指針或單位指針嗎?爲什麼這個工作?

回答

3

__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爲空。

+0

'__uuidof()'不僅限於Microsoft。其他一些編譯器也實現'__uuidof()'。 – 2015-03-31 23:05:26