免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123
最近访问板块 发新帖
楼主: hahasasa
打印 上一主题 下一主题

怎么理解这个 *(void **)(&cosine) ? [复制链接]

论坛徽章:
0
21 [报告]
发表于 2012-07-04 16:23 |只看该作者
啊,看明了。。。
要点:
1, ISO C不要求编译器实现数据类型指针和函数指针相互赋值,也就是说,有的编译器允许相互赋值,有的不允许。(http://pubs.opengroup.org/online ... unctions/dlsym.html)
2,*(void **) (&cosine) = dlsym(handle, "cos"); 作者这样写,就是用来消除1中不允许的情况。
3,*(void **) (&cosine) = dlsym(handle, "cos"); 的意思是:
等号左侧,将cosine转换成二级指针(void型的数值指针),然后将他的一级指针赋值,所赋的值即为dlsym的返回值(void型的数值指针,但这个指针实质是库中cos函数的入口地址),这样,cosine的类型依然是函数指针变量,而此变量的值却被赋成了库中cos函数的入口地址。说白了,就是强行赋值,二级指针式void型,但一级指针还是函数指针。
4,其实,这个函数可以用类型转换替代: cosine=(double (*)(double))dlsym(handle, "cos");

论坛徽章:
0
22 [报告]
发表于 2012-09-19 15:24 |只看该作者
centos里也是这样:cosine = dlsym(handle, "cos");的回复 20# 剑客生涯


   

论坛徽章:
0
23 [报告]
发表于 2014-03-14 14:23 |只看该作者
{:3_182:}我也没看到楼主那段,我用的centos5.3的手册;

论坛徽章:
2
2015年亚洲杯之乌兹别克斯坦
日期:2015-04-15 15:43:482015亚冠之迪拜阿赫利
日期:2015-06-30 20:36:46
24 [报告]
发表于 2014-03-19 13:44 |只看该作者
又涨知识了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP