C语言的回调函数与C++虚函数功能是一样的
- 1. C语言中引入回调函数的原因
- 1.1 为了实现泛型化编译,想一下如果理解虚函数,就理解了。
- 举例说明:有个功能函数f = f1+f2,在没有回调函数时,这个f是一个合成的功能函数,包括f1及f2功能,那么f就不灵活了,因为f1与f2被写死了。假如说吧f1是打雷功能,满足打雷条件产生时f1就会产生f2,一般情况下f2是下雨,f2也可能是下雪,也f2可能是下金子(只要老天爷有这个想法) ,如果f它只是一个函数,将f1及f2功能绑紧了;当然绑紧了也不是问题,也可把f分成f1与f2,然后f(){f1; f2; }; 但这样f却不灵活,因为f在还没有引用回调函数时,它此时是一个普通的函数即f的参数中没有函数指针,f通过参数无法影响f2不同类型的功能,如果f2是一个比较功能的函数,它可能是int类型的比较,也可能是char类型的数据比较,也可能是float类型(当然如果你非要(void*)这个万能类型强转也勉强可以,但是我们知道强转有时是很不安全的,同时,如果这个函数要被调用上亿次,那你多出上亿次的强转,那也是不可取的,科学的角度中如果任何一个更优的东西产生了,在相同条件下能达到一样的效果,所付出的“力气”比较大的一定会被淘汰,算了,傻子都知道做,走一步路能到达的地方,哪个没事走三步才能到达,多出的二步,难道力气没处放?)但使用回调函数却可以解决上面的问题,回调函数也主要是为了解决上面的现象而生的。
1. C语言中引入回调函数的原因
1.1 为了实现泛型化编译,想一下如果理解虚函数,就理解了。
举例说明:有个功能函数f = f1+f2,在没有回调函数时,这个f是一个合成的功能函数,包括f1及f2功能,那么f就不灵活了,因为f1与f2被写死了。假如说吧f1是打雷功能,满足打雷条件产生时f1就会产生f2,一般情况下f2是下雨,f2也可能是下雪,也f2可能是下金子(只要老天爷有这个想法) ,如果f它只是一个函数,将f1及f2功能绑紧了;当然绑紧了也不是问题,也可把f分成f1与f2,然后f(){f1; f2; }; 但这样f却不灵活,因为f在还没有引用回调函数时,它此时是一个普通的函数即f的参数中没有函数指针,f通过参数无法影响f2不同类型的功能,如果f2是一个比较功能的函数,它可能是int类型的比较,也可能是char类型的数据比较,也可能是float类型(当然如果你非要(void*)这个万能类型强转也勉强可以,但是我们知道强转有时是很不安全的,同时,如果这个函数要被调用上亿次,那你多出上亿次的强转,那也是不可取的,科学的角度中如果任何一个更优的东西产生了,在相同条件下能达到一样的效果,所付出的“力气”比较大的一定会被淘汰,算了,傻子都知道做,走一步路能到达的地方,哪个没事走三步才能到达,多出的二步,难道力气没处放?)但使用回调函数却可以解决上面的问题,回调函数也主要是为了解决上面的现象而生的。
##文字描述有点多,但要解决清楚,真要不少文字才能说清楚。经常看到一个例子:一个人A去商店买东西C1,商店没货,于是A给商店老板B一个电话号码,当有货时,B给A打电话,然后说电话码相当于回调函数。以前看时,觉得这故事很简单呀,但是对于初学者真不太明白,故事很简单,但是比方解释的回调函数却很模糊。