#define LOADBASSFUNCTION (f) *((void **)&f)=(void*)GetProcAddress (hBass,# f)
这一句话使用*((void**)&f)的原因在于,转化目标为左值(即转化f为void*类型(*)的函数指针)。
注意这里的(void**)强制类型转换仅仅只是重新声明了指针解引用的方式,并没有提升指针的引用层级。意思上*((void**)&f)与f是相等的(忽略(void**)只看*&f就知道这本质上就是先取地址再解引用)。但是不能直接使用f,因为一个函数名不能做左值(要做左值必须指针化,也就是变成函数指针)。如果需要一个函数名直接做左值的话,需要将其转换为指针再取内容。实际上(void**)可以被看成(void*  *),后面的*表示函数被取地址后是一个指针,前面的void*表示这个指针被从新解释成了指向void*类型的指针(也就是相当于函数名被转换成了一个指针),之后对这个地址(&f)解引用,得到的自然就已经是一个函数指针了。
在hge中有这样一行代码:
#define LOADBASSFUNCTION(f) *((void**)&f)=(void*)GetProcAddress(hBass,#f)
这是一个宏,作用是将任意函数指针f,都赋值成来自动态链接库的同名函数。右边使用的是(void*)指针做强制类型转换,这是一个通用的方法,不用担心具体函数签名是什么。
另外,只能使用函数指针来接收一个函数地址,无论是从动态库导出的函数。还是其他的函数。
 

注释:
(*)在c++中void*可以接收所有类型的指针,但是反之不可。在c中void*既可以赋值给任何指针,也可以被任何指针赋值。

最新文章

  1. Python学习Day2笔记(集合和文件操作)
  2. C#微信公众平台开发—高级群发接口
  3. LeetCode Range Sum Query 2D - Mutable
  4. 冲刺阶段day3
  5. JAVA和C# 3DES加密解密
  6. OpenJudge计算概论-鸡兔同笼【新版题目,简单计算级别】
  7. poj 1811 Prim test
  8. galera mysql 多主复制启动顺序及命令
  9. OPPO通过AWS节约大量成本提供海外服务
  10. OleContainer操作Excel以二进制方式读写数据库
  11. echarts 某省下钻某市地图
  12. jq 动态添加.active 实现导航效果
  13. Java数据结构和算法(十二)——2-3-4树
  14. springboot自动生成mysql的DAO层代码
  15. SharePoint如何配置Ipad跳转等问题
  16. python3-多装饰器的执行顺序
  17. 第1课:SQL注入原理深度解析
  18. Http&Tomcat
  19. MongoDB基础命令
  20. 【angular5项目积累总结】breadcrumb面包屑组件

热门文章

  1. Luogu P1471 方差 线段树
  2. void类型指针的基本用法
  3. lintcode - 房屋染色
  4. java的Spring学习2--构造函数注入
  5. A reader
  6. hdu2066一个人的旅行(disjkstra)
  7. linux 下结合find 和 rm 删除大量文件
  8. 搭建一个wordpress网站需要做哪些工作
  9. git只clone仓库中指定子目录和指定文件的实现
  10. rpm命令相关