[英]How does this make sense: *(void **)(&fptr) = dlsym(handle, “my_function”);`
代码来自此页面: http : //pubs.opengroup.org/onlinepubs/009695399/functions/dlsym.html
你能帮我理解一下吗? 它接受函数指针的地址,将其转换为void **然后取消引用它。 我不知道为什么它必须像这样工作。
我感谢您的帮助! 到目前为止,我所得到的唯一建议是“从右到左阅读”或类似“从右到左阅读”。
代码的含义是:
fptr
的地址。 此表达式的类型是指向函数的指针(某些特定类型)。 fptr
指针,就好像它是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
然后引用并分配函数的返回值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.