这有什么意义:*(void**)(&fptr)= dlsym(handle,"my_function");`

Blu*_*lub 2 c

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

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

我感谢您的帮助!到目前为止,我所得到的唯一建议是"从右到左阅读"或类似"从右到左阅读".

R..*_*R.. 10

代码的含义是:

  1. 取地址fptr.此表达式的类型是指向函数的指针(某些特定类型).
  2. 将指针表达式转换为"指向void的指针".
  3. 取消引用该对象的指针,fptr就好像它是一个类型的对象一样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);
Run Code Online (Sandbox Code Playgroud)