今天看《NS3网络模拟器 基础及应用》,看到了回调这一块,基本介绍,可以参见:http://hi.baidu.com/ritrachiao/item/977924c32637db5ebdef69a3。
大概是说,大型系统为了降低模块之间的依赖关系,提出了回调机制-callback。
首先,我们将来看看什么是回调机制,然后看看怎么应用回调机制。
1. 什么是回调,参考知乎上的理解:http://www.zhihu.com/question/19801131?
顾名思义,回调是回头过来调用的意思。举一个简单的栗子,我们去食堂吃饭,点了一个菜,可能得等会,这段时间我们可以拿来干其它事情,比如玩游戏什么的,然后跟老板说,我坐在**座位上,做好了直接叫我过来就可以了。
这个过程中,首先,我们在老板那里注册了信息,提交了我们的座位信息,然后师傅做好之后,触发了事件,过来通知我们过来拿饭(回调)。 系统中,很多定时任务也是这样的。
2. 怎么应用回调?参考:http://blog.csdn.net/jackystudio/article/details/11720325
回调其实,就是一个函数指针,这个指针指向函数的初始地址。
函数指针的声明:
typedef 返回类型(*函数指针类型名)(函参列表);
刚开始看到这个,我理解了半天,后来翻一翻谭浩强的C语言,就立马理解了。 我们定义一个函数指针,是这样的:
void (*f)(int a,int b)指针f ,指向了一个函数,有返回值和形参。typedef的用法是这样的:
1. 先安定义变量的方法写出定义体,比如前面的,void (*f)(int a,int b); 2.将变量名换成新类型名,比如,将f换成CALLBACK; 3.在最前面加typedef,比如typedef void (*CALLBACK)(int a,int b); 4.然后用新类型去定义变量。
关于给函数指针赋值的问题,可以赋值为函数名,也可以是函数名取地址,两者的值是相同的,具体参见:http://my.oschina.net/mavericsoung/blog/174110 ,类似于数组名和数组第一个元素的地址一样。
C语言中的回调怎么写呢?
/* * main.cpp * * Created on: 2014-4-15 * Author: zy */ #includeusing namespace std; typedef void(*FUN)(int,int); //定义函数指针类型 void min(int a,int b); void max(int a,int b); void min(int a,int b) { int minvalue=a b a:b; std::cout<<"Max value is "<
3. 回调函数的常见应用(1)比如多线程中线程创建函数:
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);中间的void *(*start_routine) (void *)就是一个函数指针。(2)而C++的模板,也就是泛型,也是通过回调函数来实现的,具体可以参见:http://hi.baidu.com/sunmoon_zheng/item/187a3e9891b9f2f22816477f