提及反弹表达式,我也随手在网路上翻了呵呵,我辨认出说的都较为详尽班莱班县乏味了。许多人的解说员都较为类似于,回这回他们刚碰触的这时候,我急于从两个较为单纯的视角用两段话笑了笑反弹表达式的采用和认知。
重点项目来了:甚么是回调表达式?
在流程中把你的表达式改成表达式操作符,用操作符去代替你沃苏什卡写的表达式名,那个被代替的表达式是反弹表达式。
完结!
用个单纯的标识符模拟呵呵
//这儿是它的子流程 Led.h #ifndef __LED_H__ #define __LED_H__ void Led_On(void); #endif //这儿是两个文档 Led.c //这是两个表达式,假定它有个机能,是照亮LED灯 void Led_On(void) { LED = TRUE; }这儿有另两个流程文档
//这儿是它的子流程 #ifndef __SWITCH_H__ #define __SWITCH_H__ #include “Led.h” //方法一,引用LED头文件 void Get_Switch_State(void); #endif //这儿是另两个文档 switch.c //这儿有另两个表达式,假定它检测到某信号后需要照亮LED灯和处理一些事情; extern void Led_On(void); //方法二,外部申明呵呵Led_On表达式,如此才能跨表达式调用 void Get_Switch_State(void) { if(Signel == TRUE) Led_On();//调用Led_On()表达式,实现照亮LED机能 //……. //do something } /* 要想能正常调用Led_On()表达式,必须采用以上两个方法之一 */上面是两个普通的流程流程,流程中有个普通的表达式调用,如果,我将Get_Switch_State()中的Led_On()更改成指向Led_On()表达式的表达式操作符,那么这这时候Led_On就成了反弹表达式。
还是在另两个流程文档中
//这儿是它的子流程 #ifndef __SWITCH_H__ #define __SWITCH_H__ #typedef void(*pFun)(void); //表达式操作符原型定义 重点项目一 void Get_Switch_State(void); void CallBack_Reg(pFun cb); #endif //这儿是另两个文档 switch.c //这儿有另两个表达式,假定它检测到某信号后需要照亮LED灯和处理一些事情; pFun CallBack_Ptr; //定义两个表达式操作符 重点项目二 //反弹表达式的注册表达式CallBack_Reg() void CallBack_Reg(pFun cb) { if(CallBack_Ptr ==0) //为表达式操作符赋值,当然它首先要没有被赋值 CallBack_Ptr = cb; } void Get_Switch_State(void) { if(Signel == TRUE) CallBack_Ptr();//调用Led_On()表达式的操作符,实现照亮LED机能 重点项目三 //……. //do something } /* 辨认出关键点没有? switch.c 中再也没有出现Led_On();那它如何实现调用? 答案是还需要在其它地方 比如说main表达式中把Led_On()表达式和CallBack_Ptr 那个操作符绑定呵呵 */ void main(void) { Gpio_Init(); Bsp_Init(); Timer_Init(); CallBack_Reg(Led_On); //重点项目四 while (1) { ……. } }从上面的标识符中可以明显辨认出几个特点
1.switch.c和.h中没有出现Led_On()表达式了。 Led_On()表达式被函数操作符CallBack_Ptr代替了。
2.switch.c和.h中没有在引用文档Led.h了,实现了两个c文档的解耦,使他们的关联性降低了。
此时表达式Led_On()就可以被称作 反弹表达式 了。
讲解完毕
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~好像还有点意犹未尽
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
总结呵呵,不要被反弹表达式的各种高深讲解给弄晕了头脑,它实际是将你的表达式用表达式操作符代替了,表达式操作符中存放的是你的表达式地址。
为了让表达式操作符CallBack_Ptr能指向你Led_On()的地址,你需要做两个注册机能表达式CallBack_Reg(),将你要调用的表达式地址传递给表达式操作符CallBack_Reg(Led_On);即CallBack_Ptr = Led_On。
这样,在调用CallBack_Ptr 的这时候就等于调用了Led_On。
完美解决。。
最后说明呵呵表达式操作符的定义
typedef void(pFun *)(void); //第两个void表示指向的表达式返回参数为空,第二个void表示输入参数为空
对比呵呵它要指向的表达式 void Led_On(void) ; 数数void数量和位置认知了吧。
那如果有个表达式带有输入参数怎么办呢?
聪明的你一定想到了
typedef void( pFun *)(unsigned char);
它可以指向的表达式就如同 void Led_OnOff(unsigned char ) ;
采用
pFun CallBack_Ptr ; //定义表达式操作符
……….//注册表达式操作符
CallBack_Ptr (InputDat); //采用表达式操作符,并传递值InputDat给了表达式
………
对于有返回值和多个输入参数的表达式就希望聪明的你举一反三了!
完毕!