2011-08-08 23 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であるとします。次に&pfnT*です。これは、キャスト式(括弧内のもの)によってキャストされてFARPROC*になります。最後に、これは逆参照され、FARPROC&となります。

これはすべてのように扱われており、そのタイプがFARPROCであるかのように扱われていることを示しています。ここで

は、一般的な例です:

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

pfnGetProcAddress(h, szFn)から受信したアドレスを格納するFARPROCにキャスト型で関数ポインタである、だから

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

に相当します。

[注。型キャストのこの種は、C++では非推奨とされている場合、私は、わからない]

+0

これは同等ではありません。左辺には左辺値(参照型など)が必要なため、間接化します。 –

+0

@Alexandre、あなたのポイントを得ることができませんでした。 '(FARPROC)pfn'は左辺値ですか? – iammilind

+0

それはありません。 '(FARPROC)pfn'を書くと、' pfn'の値をキャストして、それはrvalueになります。 –