提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
回调函数
一、回调函数是什么,原理?
回调函数的使用本质上就是函数指针的使用。
下面简单的举例
int Function_Add(int a,int b)//一个加法函数
{
return (a+b);
}
int Function_Multiply(int a,int b)//一个乘法函数
{
return (a*b);
}
再定义一个函数,函数的形参是函数指针int(*function_ptr)(int a,int b)。
int Program(int(*function_ptr)(int a,int b),int para1,int para2)
{
return funtion_ptr(para1,para2);
}
这样就可以通过Program函数调用Function_Add函数和Function_Multiply函数了,这里Function_Add和Function_Multiply就被称作回调函数
Program(Function_Add,3,5);
Program(Function_Multiply,3,5);
二、为什么要用回调函数
模块化设计、方便理解和分工合作,一方可以只编写类似Function_Add这样的回调函数,另一方则无须在意回调函数的具体实现,只要会调用回调函数就行了。而且添加新的类似的功能也比较方便,只需要再写一个新的回调函数就可以了。
就像流水线上一样,一部分人只负责制造零件(回调函数)就行,另一部分人只负责把零件组装起来(调用回调函数)。
三、回调函数的应用
通过typedef重命名函数指针
例如可以这样重命名typedef int(*FuncPtr_T)(int a,int b)
typedef 的用法是 typedef 原类型 别名
这里可以把int(*)(int a,int b)
理解成原类型,FuncPtr_T理解成别名
这样在定义多个函数指针时比较方便。
Program函数就可以像下面一样写了
int Program(FuncPtr_T function_ptr,int para1,int para2)
{
return funtion_ptr(para1,para2);
}
定义多个函数指针一般使用结构体
可以这样用
typedef struct
{
FuncPtr fun_add;
FuncPtr fun_multiply;
FuncPtr fun_sum;
}S_CallBack_T;
S_CallBack_T CallBack ={Function_Add,Function_Multiply,Function_Sum};
也可用数组
FuncPtr_T CallBack_Buffer[] ={Function_Add,Function_Multiply,Function_Sum};
剩下的无非就是对结构体和数组的使用了。例如在Rtos和stm的HAL库中就有很多类似的使用。
总结
以上就是对回调函数的简单说明,笔者对函数指针的理解并不深刻,如有错误欢迎指出,基础薄弱的码友可以去看看大佬们写的有关函数指针和回调函数的文章。