gpt4 book ai didi

c - "(datatype) (*ptrname) (datatype)"是什么意思?

转载 作者:行者123 更新时间:2023-11-30 18:10:48 27 4
gpt4 key购买 nike

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;
}

根据书中所述,名为“function”的函数是从以下脚本中调用的

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

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

最佳答案

声明内容如下:

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

然后使用dlsym调用的结果初始化func指针,该结果返回函数“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() 被解析为 *(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

甚至是指向返回数组指针的函数的指针数组的指针:

T (*(*(*a)[N])())[M];

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

关于c - "(datatype) (*ptrname) (datatype)"是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55074134/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com