我正在学习指针,我迷失在这段代码中:
template<typename T>
inline T export(const char *dll, const char *name)
{
return (T) ((void *(*)(const char *, const char *))GetProcAddress(GetModuleHandleA(dll), name));
}
更确切地说,我不理解它对void指针进行奇怪转换的部分。
更确切的问题:*(*)
做什么以及何时可以使用它?
答案 0 :(得分:2)
(void *(*)(const char *, const char *)
表示您将以下函数转换为函数指针(*)
,它返回一个void指针void *
,并将两个常量char指针(const char *, const char *)
作为参数
这样的函数指针本身可能被声明为
(void *(*foo)(const char *, const char *);
答案 1 :(得分:1)
void *(*)(const char *, const char *)
是一个函数指针,它返回void*
并作为参数2 const char *
。
void * (*) (const char *, const char *)
^^^^^^ ^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
return pointer signature
value
基本上,这会将GetProcAddress
的返回值转换为void *(*)(const char *, const char *)
,然后将其强制转换为T
答案 2 :(得分:1)
(*)
说&#34;这是一个函数指针&#34;。
右边的东西(const char *, const char *)
是参数类型
左边的东西void *
是返回类型。
因此它将GetProcAddress
的结果转换为函数指针类型void *(*)(const char *, const char *)
。
强制转换是完全没有意义的,因为结果立即转换为调用者提供的类型T
。
该功能还有一个比以往更令人困惑的名字,因为它与导出相反。
答案 3 :(得分:1)
(T) ((void *(*)(const char *, const char *))GetProcAddress(...)
GetProcAddress()
返回的值被转换两次:一次转换为指向函数的指针,该函数接收两个类型为const char *
的参数并返回void *
,然后将结果转换为类型{ {1}}
T
/ C
变量和类型声明从内到外解码。从变量或类型名称开始,在右侧检查C++
(函数)或()
(数组),然后在左侧检查函数返回的值或包含在数组中但是没有越过括号。删除内部括号并重复。
例如:
[]
void *(*p)(const char *, const char *)
是(没有在右边,没有穿过括号)一个指针(左边是p
)到(转义一级括号)一个函数有一个类型为{{1的两个参数返回*
(左侧)。(右侧的const char *
)。
总结一下,(...)
是一个指向函数的指针,该函数接收两个void *
个参数并返回p
。
const char *
是一个变量。如果整个声明的前缀为void *
,则p
将成为新类型的定义。
没有typedef
(并且没有p
)它是一个匿名类型,用于类型转换的问题:通过将其放在括号中,p
返回的值被转换到上述类型。前面的typedef
会强制进行另一次转换,以输入GetProcAddress()
。
在已发布的表达式中,上述复杂类型包含在两对括号中。只需要一对。另一个可以安全地删除。