1. 回调函数
1.1 回调函数的定义
- 回调函数:指一个通过函数指针调用的函数;
- 回调函数:把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数;
1.2 回调函数的意义
- 因为可以把调用者与被调用者分开,所以调用者不关心谁是被调用者。
- 它只需知道存在一个具有特定原型和限制条件的被调用函数。
- 简而言之,回调函数就是允许用户把需要调用的方法的指针作为参数传递给一个函数,以便该函数在处理相似事件的时候可以灵活的使用不同的方法。
- 想知道回调函数在实际中有什么作用?
(1)比如我要写一个子模块给你用,来接收远程socket发来的命令。当我接收到命令后,需要调用你的主模块的函数,来进行相应的处理。但是我不知道你要用哪个函数来处理这个命令,我也不知道你的主模块是什么.cpp或者.h,或者说,我根本不用关心你在主模块里怎么处理它,也不应该关心用什么函数处理它……怎么办?使用回调!
(2)先假设有这样一种情况:我们要编写一个库,它提供了某些排序算法的实现(如冒泡排序、快速排序、shell排序、shake排序等等),为了能让库更加通用,不想在函数中嵌入排序逻辑,而让使用者来实现相应的逻辑;或者,能让库可用于多种数据类型(int、float、string),此时,该怎么办呢?可以使用函数指针,并进行回调。
(3)回调可用于通知机制。例如,有时要在A程序中设置一个计时器,每到一定时间,A程序会得到相应的通知,但通知机制的实现者对A程序一无所知。那么,就需一个具有特定原型的函数指针进行回调,通知A程序事件已经发生。实际上,API使用一个回调函数SetTimer()来通知计时器。如果没有提供回调函数,它还会把一个消息发往程序的消息队列。
1.3 回调函数的实现机制
第一步:定义一个回调函数:
//定义无参回调函数 void PrintfText() { printf("Hello World!\n"); } //定义带参回调函数 void PrintfText(char* s) { printf(s); }
第二:提供函数实现的一方在初始化的时候,将回调函数的函数指针注册给调用者:
//定义实现无参回调函数的"调用函数"