函数指针
用法
例:int (*p)(int a,int b);
用法:p=‘函数名’ //p可当做‘函数名’的函数用(例: (*p)(a,b) )
可作为变量输入函数:int Wud(int a,int b,(*p)(int,int) ){ (*p)(a,b); }
实战案例
用做一个回调函数,相当于传递hal层数据到app层的函数调用
1.定义一个函数指针
typedef void (*KeyEvent_CallBack_t)(KEY_VALUE_TYPEDEF Keys);
2.封装一个赋值指针函数
void hal_KeyScanCBSRegister(KeyEvent_CallBack_t pCBS)
{
if(KeyScanCBS==0)
{
KeyScanCBS = pCBS;
}
}
3.在app层写一个处理数据的函数
static void KeyEventHandle(KEY_VALUE_TYPEDEF keys)
{
if((keys==KEY1_CLICK)
||(keys==KEY2_CLICK)
||(keys==KEY3_CLICK)
||(keys==KEY4_CLICK)
||(keys==KEY5_CLICK)
||(keys==KEY6_CLICK)
)
{
LedMsgInput(LED1,LED_LIGHT,1);
}
else if((keys==KEY1_CLICK_RELEASE)
||(keys==KEY2_CLICK_RELEASE)
||(keys==KEY3_CLICK_RELEASE)
||(keys==KEY4_CLICK_RELEASE)
||(keys==KEY5_CLICK_RELEASE)
||(keys==KEY6_CLICK_RELEASE)
)
{
LedMsgInput(LED1,LED_BLINK4,1);
}
else if((keys==KEY1_LONG_PRESS_RELEASE)
||(keys==KEY2_LONG_PRESS_RELEASE)
||(keys==KEY3_LONG_PRESS_RELEASE)
||(keys==KEY4_LONG_PRESS_RELEASE)
||(keys==KEY5_LONG_PRESS_RELEASE)
||(keys==KEY6_LONG_PRESS_RELEASE)
)
{
LedMsgInput(LED1,LED_DARK,1);
}
}
4.将app层处理数据的函数赋值入函数指针
hal_KeyScanCBSRegister(KeyEventHandle);
5.在hal层调用函数指针(相当于使用app层的函数)
void hal_KeyProc(void)
{
//中间省略了其他代码
if(keys)
{
if(KeyScanCBS)
{
KeyScanCBS((KEY_VALUE_TYPEDEF) keys);
}
}
}
优点与用处
让代码更有序,方便修改和移植,如果未来需要将这个项目的这一模块移植到别的项目上,这就直接在需要调用的函数/模块中调用指针的赋值函数就好了,不需要修改这个模块的代码。