2

代码来自这个页面: http: //pubs.opengroup.org/onlinepubs/009695399/functions/dlsym.html

你能帮我理解这个吗?它获取函数指针的地址,将其转换为 void**,然后取消引用它。我不知道为什么它必须这样工作。

我感谢您的帮助!到目前为止,我得到的唯一建议是“从右到左阅读”或类似“从右到左循环阅读”。

4

3 回答 3

10

代码的意思是:

  1. 取地址fptr。这个表达式的类型是指向函数的指针(某种特定类型)。
  2. 将该指针表达式转换为“指向 void 的指针”。
  3. 取消引用该指针以访问对象fptr,就好像它是 type的对象一样void *
  4. 将右边的结果赋值给第3步得到的左值。

不幸的是,在 POSIX 中编写这个示例的人已经破解了,因为第 3 步违反了 C 语言的别名规则,因此调用了未定义的行为。特别是,现实世界的编译器会以破坏预期用途的方式优化此代码。

这个例子的作者试图实现的是避免将右手边从指向 void指针转换为指向函数的指针。这是基于 C 标准要求此强制转换生成警告的说法,但我已经彻底搜索过这样的要求,但找不到这样的要求。

如果确实存在这样的问题(警告要求),那么在不调用未定义行为(如 POSIX 文本中的坏例子)的情况下使警告静音的唯一方法是这样做:

void (*fptr)(); // or whatever function pointer type you want
void *temp = dlsym(handle, "my_function");
memcpy(&fptr, &temp, sizeof fptr);
于 2012-05-09T15:39:53.493 回答
1

该函数返回一个函数指针。那个代码说嘿把我的函数指针变量给我它的地址。将其投射到void **. 现在尊重void **并将 void * = 的值设置为我从调用中获得的指针。

于 2012-05-09T15:39:43.827 回答
0

*(void **)(&fptr) = dlsym(handle, “my_function”);

为了使这更简单,

fptr是一个指针。

&fptr是那个指针的地址。

您正在将其类型转换为pointer to a pointer to a void

然后引用并分配函数的返回值。

于 2012-05-09T16:08:24.200 回答