c语言回调函数详解

一、c语言回调函数详解及示例

回调函数:函数 F1 调用函数 F2 的时候,函数 F1 通过参数给函数 F2 传递了另外一个函数 F3 的指针,在函数 F2 执行的过程中,函数F2 调用了函数 F3,这个动作就叫做回调(Callback),而先被当做指针传入、后面又被回调的函数 F3 就是回调函数。

示例

#include <stdio.h>
void F3()
{
	printf("F3()\n");
}
void F2(void(*callback)())
{
	printf("函数 F2() 中回调函数 F3()\n");

	//以下两种调用方式等价于直接使用
	//F3();

	callback();   //调用方式1
	(*callback)();//调用方式2
}
void F1()
{
	void (*pf)();
	printf("F1()\n");
	pf = F3;

	printf("----调用方式1----\n");
	F2(pf);

	printf("----调用方式2----\n");
	F2(F3);
}

int main()
{
	F1();
	return 0;
}

运行结果

F1()
----调用方式1----
函数 F2() 中回调函数 F3()
F3()
F3()
----调用方式2----
函数 F2() 中回调函数 F3()
F3()
F3()

1、什么是回调函数

回调函数就是一个通过函数指针调用的函数。如果把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,就说这是回调函数。

可以将"回调函数"在字面上做个分解。中文其实可以理解为这么两种意思:1) 被回调的函数;2) 回头执行调用动作的函数。

回调:把一段可执行的代码像参数传递那样传给其他代码,而这段代码会在某个时刻被调用执行,这就叫做回调。如果代码立即被执行就称为同步回调,如果在之后晚点的某个时间再执行,则称之为异步回调。 [ 使用异步回调必须有 多线程或者有限状态机 机制 ]

2、为什么要使用回调函数

很多朋友可能会想,为什么不像普通函数调用那样,在回调的地方直接写函数的名字呢?这样不也可以吗?为什么非得用回调函数呢?有这个想法很好,因为在网上看到解析回调函数的很多例子,其实完全可以用普通函数调用来实现的。要回答这个问题,我们先来了解一下回调函数的好处和作用,那就是解耦,对,就是这么简单的答案,就是因为这个特点,普通函数代替不了回调函数。所以,在我眼里,这才是回调函数最大的特点。

在回调中,主程序把回调函数像参数一样传入库函数。这样一来,只要我们改变传进库函数的参数,就可以实现不同的功能,这样有没有觉得很灵活?并且丝毫不需要修改库函数的实现,这就是解耦。再仔细看看,主函数和回调函数是在同一层的,而库函数在另外一层,想一想,如果库函数对我们不可见,我们修改不了库函数的实现,也就是说不能通过修改库函数让库函数调用普通函数那样实现,那我们就只能通过传入不同的回调函数了,这也就是在日常工作中常见的情况。

3、怎么使用回调函数

知道了什么是回调函数,了解了回调函数的特点,那么应该怎么使用回调函数?下面来看一段简单的可以执行的同步回调函数代码。

示例


```c
#include<stdio.h>

int Callback_1() // Callback Function 1
{
    printf("Hello, this is Callback_1 ");
    return 0;
}

int Callback_2() // Callback Function 2
{
    printf("Hello, this is Callback_2 ");
    return 0;
}

int Callback_3() // Callback Function 3
{
    printf("Hello, this is Callback_3 ");
    return 0;
}

int Handle(int (*Callback)())
{
    printf("Entering Handle Function. ");
    Callback();
    printf("Leaving Handle Function. ");
}

int main()
{
    printf("Entering Main Function. ");
    Handle(Callback_1);
    Handle(Callback_2);
    Handle(Callback_3);
    printf("Leaving Main Function. ");
    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.

带参数的回调函数

示例

#include <iostream>
#include <stdio.h>


using namespace std;
int add(int a, int b) {
    cout << "a + b = " << a + b << endl;
    return a+ b;
    
}
//减法

int subtr(int a, int b) {
    cout << "a - b = " << a - b << endl;
    return a - b;
}
//乘法
int multiplication(int a, int b) {
    cout << "a * b = " << a * b << endl;
    return a * b;
}

int division(int a, int b) {
    cout << "a / b = " << a / b << endl;
    return a / b;
}

int Handle(int a, int b,int (*Callback)(int, int)) {
    printf("Entering Handle Function.\n ");
    Callback(a,b);
    printf("Leaving Handle Function. \n");
}

int main() {
    int a = 100, b = 50;
    printf("Entering Main Function.\n ");
    Handle(a, b, add);
    Handle(a, b, subtr);
    Handle(a, b, multiplication);
    Handle(a, b, division);
    printf("Leaving Main Function. \n");
    return 0;
}

运行结果

Entering Main Function.
 Entering Handle Function.
 a + b = 150
Leaving Handle Function. 
Entering Handle Function.
 a - b = 50
Leaving Handle Function. 
Entering Handle Function.
 a * b = 5000
Leaving Handle Function. 
Entering Handle Function.
 a / b = 2
Leaving Handle Function. 
Leaving Main Function.

二、回调函数的例子以及理解

示例

void 做面条(int x)//回调函数
{
    做x碗面条;
}
void 做米线(int x)//回调函数
{
    做x碗米线;
}
void 做蛋炒饭(int x)//回调函数
{
    做x碗蛋炒饭;
}
//吃饭函数里面内容不可见,只知道可以实现做几碗我需要的饭
viod 吃饭( int x, void (*做饭)(int) )
{
	摆桌子();//吃饭的公有功能函数
	做饭(x);
	洗碗();//吃饭的公有功能函数
}

void mian(void)
{
	吃饭(2,做米线);();
	睡觉();
}

回调函数的意义在于,中间函数(库函数)的公有部分可以不必拆出来写到每一个子函数。
就上面例子来讲:对于吃饭来说操作流程都是一样的,没有必要全部把公有部分( 摆桌子()、洗碗() )单独拿出来写到3个不同的吃饭函数。也可以对应说是中间数吃饭()里面的内容对我们不可见,我们只能将具体做饭函数放入到中间函数去执行。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值