2011-08-08 63 views
0

我有一個關於函數指針的基本問題。 在下面的代碼片段中,我該如何閱讀「 *(FARPROC*)&pfn =」?函數指針基本問題

IFastString *CallCreateFastString(const char *psz) { 

static IFastString * (*pfn)(const char *) = 0; 

if (!pfn) { 

const TCHAR szDll[] = _TEXT("FastString.DLL"); 

const char szFn[] = "CreateFastString"; 

HINSTANCE h = LoadLibrary(szDll); 

if (h) 

*(FARPROC*)&pfn = GetProcAddress(h, szFn); 

} 

return pfn ? pfn(psz) : 0; 

} 
+0

看一看在文檔'GetProcAddress'-你會看到,上面的情況是令人費解... http://msdn.microsoft.com/en-us/library/ms683212(v=vs.85).aspx – Nim

回答

2

這不是真的關於函數指針,而是關於通用的鑄造。

假設pfnT類型。然後&pfn的類型爲T*。這通過演員表達式(圓括號中的東西)投射到FARPROC*。最後,這被取消,產生FARPROC&

總而言之,這只是表示您將pfn視爲FARPROC類型,併爲其分配值。

這裏有一個通用的例子:

​​
0
*(FARPROC*)&pfn = GetProcAddress(h, szFn); 

相當於,

(FARPROC)pfn = GetProcAddress(h, szFn); 

所以,pfn是一個函數指針,它的類型強制轉換爲FARPROC存儲從GetProcAddress(h, szFn)接收的地址。

[注:我不知道,如果這種類型轉換的是用C++不贊成]

+0

它不等效。你需要一個左值(例如,一個引用類型)在左邊,因此是間接的。 –

+0

@Alexandre,不明白你的意思。 「(FARPROC)不是一個左翼? – iammilind

+0

不,它不是。當你寫'(FARPROC)pfn'時,你施加了'pfn'的值,它變成了一個右值。 –