C语言——回调函数

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值