2022
我们一起努力

C语言中回调函数的使用

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

为什么要使用回调函数?

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

C语言中回调函数的使用

下面以一段不完整的 C 语言代码来呈现上图的意思:

实例

#include
#include // 包含Library Function所在读得Software library库的头文件

int Callback() // Callback Function
{
   // TODO
   return 0;
}
int main() // Main program
{
   // TODO
   Library(Callback);
   // TODO
   return 0;
}

乍一看,回调似乎只是函数间的调用,和普通函数调用没啥区别,但仔细一看,可以发现两者之间的一个关键的不同:在回调中,主程序把回调函数像参数一样传入库函数。这样一来,只要我们改变传进库函数的参数,就可以实现不同的功能,这样有没有觉得很灵活?并且丝毫不需要修改库函数的实现,这就是解耦。再仔细看看,主函数和回调函数是在同一层的,而库函数在另外一层,想一想,如果库函数对我们不可见,我们修改不了库函数的实现,也就是说不能通过修改库函数让库函数调用普通函数那样实现,那我们就只能通过传入不同的回调函数了,这也就是在日常工作中常见的情况。现在再把main()、Library()和Callback()函数套回前面 F1、F2和F3函数里面,是不是就更明白了?

明白了回调函数的特点,是不是也可以大概知道它应该在什么情况下使用了?没错,你可以在很多地方使用回调函数来代替普通的函数调用,但是在我看来,如果需要降低耦合度的时候,更应该使用回调函数。

怎么使用回调函数?

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

实例

#include

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.

可以看到,Handle()函数里面的参数是一个指针,在main()函数里调用Handle()函数的时候,给它传入了函数Callback_1()/Callback_2()/Callback_3()的函数名,这时候的函数名就是对应函数的指针,也就是说,回调函数其实就是函数指针的一种用法。现在再读一遍这句话:A “callback” is any function that is called by another function which takes the first function as a parameter,是不是就更明白了呢?

怎么使用带参数的回调函数?

眼尖的朋友可能发现了,前面的例子里面回调函数是没有参数的,那么我们能不能回调那些带参数的函数呢?答案是肯定的。那么怎么调用呢?我们稍微修改一下上面的例子就可以了:

实例

#include

int Callback_1(int x) // Callback Function 1
{
   printf("Hello, this is Callback_1: x = %d ", x);
   return 0;
}

int Callback_2(int x) // Callback Function 2
{
   printf("Hello, this is Callback_2: x = %d ", x);
   return 0;
}

int Callback_3(int x) // Callback Function 3
{
   printf("Hello, this is Callback_3: x = %d ", x);
   return 0;
}

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

int main()
{
   int a = 2;
   int b = 4;
   int c = 6;
   printf("Entering Main Function. ");
   Handle(a, Callback_1);
   Handle(b, Callback_2);
   Handle(c, Callback_3);
   printf("Leaving Main Function. ");
   return 0;
}

运行结果:

Entering Main Function.
Entering Handle Function.
Hello, this is Callback_1: x = 2
Leaving Handle Function.
Entering Handle Function.
Hello, this is Callback_2: x = 4
Leaving Handle Function.
Entering Handle Function.
Hello, this is Callback_3: x = 6
Leaving Handle Function.
Leaving Main Function.

可以看到,并不是直接把int Handle(int (*Callback)()) 改成 int Handle(int (*Callback)(int)) 就可以的,而是通过另外增加一个参数来保存回调函数的参数值,像这里 int Handle(int y, int (*Callback)(int)) 的参数 y。同理,可以使用多个参数的回调函数。

本文来源:www.lxlinux.net/8363.html,若引用不当,请联系修改。

赞(0)
文章名称:《C语言中回调函数的使用》
文章链接:https://www.fzvps.com/181957.html
本站文章来源于互联网,如有侵权,请联系管理删除,本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。
图片版权归属各自创作者所有,图片水印出于防止被无耻之徒盗取劳动成果的目的。

评论 抢沙发

评论前必须登录!