代码来自这个页面: http: //pubs.opengroup.org/onlinepubs/009695399/functions/dlsym.html
你能帮我理解这个吗?它获取函数指针的地址,将其转换为 void**,然后取消引用它。我不知道为什么它必须这样工作。
我感谢您的帮助!到目前为止,我得到的唯一建议是“从右到左阅读”或类似“从右到左循环阅读”。
代码来自这个页面: http: //pubs.opengroup.org/onlinepubs/009695399/functions/dlsym.html
你能帮我理解这个吗?它获取函数指针的地址,将其转换为 void**,然后取消引用它。我不知道为什么它必须这样工作。
我感谢您的帮助!到目前为止,我得到的唯一建议是“从右到左阅读”或类似“从右到左循环阅读”。
代码的意思是:
fptr
。这个表达式的类型是指向函数的指针(某种特定类型)。fptr
,就好像它是 type的对象一样void *
。不幸的是,在 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);
该函数返回一个函数指针。那个代码说嘿把我的函数指针变量给我它的地址。将其投射到void **
. 现在尊重void **
并将 void * = 的值设置为我从调用中获得的指针。
*(void **)(&fptr) = dlsym(handle, “my_function”);
为了使这更简单,
fptr
是一个指针。
&fptr
是那个指针的地址。
您正在将其类型转换为pointer to a pointer to a void
然后引用并分配函数的返回值。