问题描述
最近开发的项目,用到了Arduino平台的OneButton按键库,官方例程只给给出了无参回调函数的使用方法,在使用带参数回调函数时,传参出现问题
语法检查提示,没有重载函数能够匹配 我的回调函数定义如下
问题排查
进入OneButton库看看这个注册回调函数的函数定义 有一个自定义的变量类型parameterizedCallbackFunction 看看他的定义 这里使用typedef 定义了一个函数指针类型的变量类型,值得注意的是,此处的typedef 用法与常见的使用方法不太一样,容易造成误解,查阅资料后终于明白,这里的用法是
- 定义了一个函数指针类型,带有一个
void* 类型的参数,返回值为void (无返回值) - 将上述函数指针类型取别名,名为
parameterizedCallbackFunction ,后面就可以用parameterizedCallbackFunction 定义变量,parameterizedCallbackFunction nuwFuction 就类似于定义int a
所以,问题出在哪???
我们再回头看一下我定义的函数 函数指针类型 显然,是函数的参数不同,函数指针中要求函数带一个void* 类型的参数,而我写的函数是Imu_Action* 类型,参数不一致,造成的函数重载无法被识别。
这里的void* 很有意思,我们都知道,void 代表空类型,那void* 代表空类型指针吗?空类型有什么指针 查阅资料得到的解释是:void* 可以指代任何类型的指针,但就是这个解释给我造成了很大的误解,我的理解是这个地方是告诉编译器这里是一个指针类型,但不指明是int* float* 还是double* ,这样便于开发者编写更为通用的程序,用户只要在这里传的是个指针就可以但事实上,这样理解是错误的,而这里的理解错误,正是问题的关键。
问题解决
回到我所定义的函数 我们不能在这里定义Imu_Action* 类型参数,因为与函数指针中要求的void* 类型不匹配,必须使用void*类型 ,也就是要写成这样
传参时将Imu_Action* 类型强制类型转换为void* 类型,在回调函数中再将void* 转换回Imu_Action* ,问题解决
|