在我们的代码中,有一个函数定义为:

A.h

extern int (*get_prof_action(void))(void);

A.c

static int (*ProfAction)(void) = NULL;

int (*get_prof_action(void))(void)
{
    return ProfAction;
}

稍后在main.c中,我想通过dlsym获得这个函数(我必须这样做),所以我这样使用.

...
int (*p_get_prof_action(void))(void);
...

void my_function(){

...
void *handle=dlopen(mylibrary,RTLD_LAZY);
p_get_prof_action = (int (*(void))(void)) dlsym(handle,"get_prof_action");
...

}

我得到了编译错误:

error: cast specifies function type at line
(int (*(void))(void)) dlsym(handle,"get_prof_action");
=======================================================

以下是我的问题:

  1. 这不是我的代码,我从来没有见过这样的用法来定义函数.你能告诉我这是什么吗?

  2. 我如何正确地获得这个p_get_prof_action?

非常感谢.这真的让我很难受!

推荐答案

您已将p_get_prof_action声明为函数,而不是函数指针.正确的声明应该是:

int (*(*p_get_prof_action)(void))(void);

正确的演员阵容应该是:

p_get_prof_action = (int (*(*)(void))(void)) dlsym(handle,"get_prof_action")

在处理函数指针时,typedef可能非常有用.有问题的函数返回一个函数指针,所以让我们为返回类型创建一个:

typedef int (*action)(void);

然后声明函数指针以返回该类型:

action (*p_get_prof_action)(void);

并按如下方式分配给它:

p_get_prof_action =  (action (*)(void))dlsym(handle,"get_prof_action");

C++相关问答推荐

C指针算法在函数参数中的应用

为什么在此程序中必须使用Volatile关键字?

C语言编译阶段与翻译阶段的关系

实现简单字典时C语言中的段错误

我怎么才能用GCC编译一个c库,让它包含另一个库呢?

函数的限制限定指针参数允许优化调用方函数吗?

为什么数组的最后一个元素丢失了?

在C++中父进程和子进程中的TAILQ队列同步问题

我在反转双向链表时遇到问题

如果格式字符串的内存与printf的一个参数共享,会发生什么情况?

为什么编译器不能简单地将数据从EDI转移到EAX?

计算SIZE_MAX元素的长数组的大小

问题:C#Define上的初始值设定项元素不是常量

在NASM中链接Linux共享库时出错-';将R_ X86_64_;foo';

将指针的地址加载到寄存器内联拇指组件中

GnuCobol 使用 double 类型的参数调用 C 函数

malloc 属性不带参数

如何根据当前舍入方向将float转换为int?

为什么这里的符号没有解析?

这种 C 函数风格的名称是什么?