C语言——回调函数
主要内容:函数指针、回调函数
1、什么是函数注册和回调
回调函数无非是对函数指针的应用,说白了就是通过使用函数指针来调用一个函数,而函数注册就是把函数指针作为参数传递出去便于别的模块使用的过程。所以函数注册就是为了回调,先注册再回调。
2、为什么要使用回调函数
回调函数可以把调用者与被调用者分开,所以调用者不关心谁是被调用者以及被调用者如何实现。它只需知道存在一个具有特定原型和限制条件的被调用函数。简而言之,回调函数就是允许用户把需要调用的方法的指针作为参数传递给一个函数,以便该函数在处理相似事件的时候可以灵活的使用不同的方法。
定义函数指针
typedef int (*Callback)(void);//声明
static Callback callback = NULL;//定义
定义函数指针结构体
typedef struct callback_fun{ //声明
int (*callback1)(int num);
int (*callback2)(int num);
int (*callback3)(int num);
} callback_fun_t;
static callback_fun_t callback_fun_; //定义
使用方式一:直接将回调函数当做函数传进来
typedef int (*Callback)(void);
static Callback callback = NULL;
int Callback_1(void) // Callback Function 1
{
printf("Callback_1:%d \r\n");
return 0;
}
int Callback_2(void) // Callback Function 2
{
printf("Callback_2:%d \r\n");
return 0;
}
int Callback_3(void) // Callback Function 3
{
printf("Callback_3:%d \r\n");
return 0;
}
int Handle(int (*callback)(void))
{
printf("Entering Handle Function. \r\n");
callback();
printf("Leaving Handle Function. \r\n");
}
int main()
{
printf("Entering Main Function. \r\n");
Handle(Callback_1); //执行回调函数
Handle(Callback_2);
Handle(Callback_3);
printf("Leaving Main Function. \r\n");
return 0;
}
//输出结果
Entering Main Function.
Entering Handle Function.
Hello, this is Callback_1
Leaving Handle Function.
Entering Handle Function.
Hello, this is Callback_2
Leaving Handle Function.
Entering Handle Function.
Hello, this is Callback_3
Leaving Handle Function.
Leaving Main Function.
使用方式二:间接地通过函数指针调用回调函数(项目实际中用的比较多)
typedef struct callback_fun
{
int (*callback1)(int num);
int (*callback2)(int num);
int (*callback3)(int num);
} callback_fun_t;
static callback_fun_t callback_fun_;
int Callback_1(int num) // Callback Function 1
{
printf("Callback_1:%d \r\n",num);
return 0;
}
int Callback_2(int num) // Callback Function 2
{
printf("Callback_2:%d \r\n",num);
return 0;
}
int Callback_3(int num) // Callback Function 3
{
printf("Callback_3:%d \r\n",num);
return 0;
}
int Handle(int (*callback)(void))
{
printf("Entering Handle Function. \r\n");
callback();
printf("Leaving Handle Function. \r\n");
}
int fun_register_init(void)
{
callback_fun_.callback1 = &Callback_1;
callback_fun_.callback2 = &Callback_2;
callback_fun_.callback3 = &Callback_3;
printf("register_init ok. \r\n");
}
int run_callback1(void)
{
return callback_fun_.callback1(1*10);
}
int run_callback2(void)
{
callback_fun_.callback2(2*10);
}
int run_callback3(void)
{
callback_fun_.callback3(3*10);
}
int main()
{
fun_register_init();
run_callback1();
run_callback2();
run_callback3();
return 0;
}
//输出打印结果
register_init ok.
Callback_1:10
Callback_2:20
Callback_3:30