gpt4 book ai didi

c - 以两种不同方式指向动态库的函数指针

转载 作者:太空狗 更新时间:2023-10-29 15:26:50 24 4
gpt4 key购买 nike

以下两个是相同的,但 C99 标准未定义从 void * 到函数指针的转换。

有人可以解释一下第二个是如何工作的吗?这有点令人困惑!

int (*fptr)(int);
fptr = (int (*)(int))dlsym(handle, "my_function");


int (*fptr)(int);
*(void **) (&fptr) = dlsym(handle, "my_function");

最佳答案

在(第二个代码粘贴的)第一行声明了一个函数指针(我想你知道)。

现在,dlsym(3)是一个返回 void * 的调用.

所以第二行也可以读作:

*((void **) (&fptr)) = dlsym(handle, "function");

否则说:而不是将函数结果转换为 int (*)(int) ,并影响 fptr 的给定结果;它将 fptr 上的指针(或将 fptr 的地址:指针上的指针)转换为 void** .然后它取消引用这个指针,有效地给出 fptr(与原来的相同,但没有 int (*)(int) 类型),然后得到 dlsym 的结果。称呼。这只是一种“欺骗”编译器不触发有关类型不匹配的警告/错误的方法。另请注意,即使您选择的语法是个人喜好问题,在您发布的任何程序中使用它之前,您也应该完全理解它。

希望对你有帮助;)

关于c - 以两种不同方式指向动态库的函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18317350/

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