“(数据类型)(* ptrname)(数据类型)”是什么意思?

时间:2019-03-09 04:59:14

标签: c linux dll

1)我目前正在尝试理解以下代码,但是我无法理解void(* func)(void)的含义,我可以理解我正在尝试保存一个名为“ function”的函数的地址来自list0513,在void指针函数处,但是等号前的强制转换(void)是什么意思?

// list0513.c
#include <dlfcn.h>
int main(void)
{       
    void *handle = dlopen("./list0513.so", RTLD_LAZY);
    void (*func)(void) = dlsym(handle, "function");
    (*func)();
    dlclose (handle);
    return 0;
}    

根据这本书,从以下脚本中调用名为“函数”的函数

// list0513dl.c
#include <stdio.h>
void function(void)
{
    printf("Hello World\n");
}

2)但是如何制作list0513.so文件?我制作的唯一文件是.c文件... 感谢您阅读本文。

2 个答案:

答案 0 :(得分:0)

声明如下:

       func           — func
      *func           — is a pointer to
     (*func)(    )    — a function taking
     (*func)(void)    — no parameters
void (*func)(void)    — returning void

然后使用func调用的结果初始化dlsym指针,该调用返回函数”function”在库list0513.so中的地址。

指针类型的一般声明规则:

T *p;       // p is a pointer to T
T *p[N];    // p is an array of pointer to T
T (*p)[N];  // p is a pointer to an array of T
T *f();     // f is a function returning a pointer to T
T (*f)();   // f is a pointer to a function returning T

在声明和表达式中,后缀[]下标和()函数调用运算符的优先级均高于一元*,因此*f()被解析为{{1} }(函数返回指针)。要声明指向数组或函数的指针,必须*(f())与数组或函数声明符进行显式分组。

声明会变得非常复杂-您可以拥有一个指向函数的指针数组:

*

或返回数组指针的函数:

T (*a[N])(); // a is an array of pointers to functions returning T

甚至指向指向数组的指针的指针,这些指针返回指向数组的指针:

T (*f())[N]; // f is a function returning a pointer to an array

不过,您可能不会在野外看到任何毛茸茸的东西(除非您遇到了我的一些旧代码)。

答案 1 :(得分:-1)

省略了函数类型的声明。完整版或扩展版应如下所示:

// list0513.c
#include <dlfcn.h>
int main(void)
{       
    void *handle = dlopen("./list0513.so", RTLD_LAZY);
    typedef void(*FUNC)();
    FUNC func = dlsym(handle, "function");
    func();     // call function
    dlclose (handle);
    return 0;
}