解释指针的这种情况

时间:2016-03-01 17:30:56

标签: c++ pointers

我正在学习指针,我迷失在这段代码中:

    template<typename T>
    inline T export(const char *dll, const char *name)
    {
        return (T) ((void *(*)(const char *, const char *))GetProcAddress(GetModuleHandleA(dll), name));
    }

更确切地说,我不理解它对void指针进行奇怪转换的部分。 更确切的问题:*(*)做什么以及何时可以使用它?

4 个答案:

答案 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()

在已发布的表达式中,上述复杂类型包含在两对括号中。只需要一对。另一个可以安全地删除。