函数指针基本问题

Function Pointer basic question

本文关键字:问题 指针 函数      更新时间:2023-10-16

我有一个关于函数指针的基本问题。在下面的代码片段中,我如何阅读这个?*(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;
}

这不是关于函数指针的,而是关于一般类型转换的。

假设pfn的类型为T。则&pfnT*型。它通过强制转换表达式(括号中的内容)被强制转换为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();
*(FARPROC*)&pfn = GetProcAddress(h, szFn);

等价于

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

所以,pfn是一个函数指针,它被类型转换为FARPROC来存储从GetProcAddress(h, szFn)接收到的地址。

[注:我不确定,如果这种类型转换在c++中是不赞成的。]