我对函数指针有一个基本的问题。
在下面的代码片段中,我该如何阅读“
*(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 :(得分:2)
这不是关于函数指针,而是关于一般的转换。
假设pfn
的类型为T
。然后&pfn
的类型为T*
。这会通过强制转换表达式(括号中的内容)强制转换为FARPROC*
。最后,这会被取消引用,产生FARPROC&
。
总而言之,这只意味着您将pfn
视为FARPROC
类型,并为其指定值。
这是一个通用的例子:
S make_an_S();
T x;
T * const px = &x;
S * const py = (S*)px;
*py = make_an_S(); // same as *(S*)&x = make_an_S();
答案 1 :(得分:0)
*(FARPROC*)&pfn = GetProcAddress(h, szFn);
相当于,
(FARPROC)pfn = GetProcAddress(h, szFn);
因此,pfn
是一个函数指针,其类型已转换为FARPROC
以存储从GetProcAddress(h, szFn)
收到的地址。
[注意:我不确定,如果在C ++中不推荐使用这种类型转换。]