Gosicfly的C/C++学习笔记(1)简单的回调函数使用

来源:互联网 发布:杭州美工培训机构 编辑:程序博客网 时间:2024/06/01 22:57

首先我们来看一下什么叫回调函数。
百度百科上关于回调函数的解释太啰嗦了,让人反而看不懂。
简单地说,回调函数就是讲一个函数当做另一个函数的参数来使用。下面是一个简单的例子:

//定义回调函数void func() {    printf("Hello World!\n");}//定义实现回调函数的"调用函数"void Callback(void (*func)()){    func();}//在main函数中实现函数回调int main(int argc,char* argv[]){    Callback(func);    return 0;}

我们可以看到func()函数是作为另一个函数Callback()的参数来使用的。从上面的代码我们可以看出,Callback()内部调用了func() .

那么这种调用方式相比于直接在Callback()内部调用func()有什么好处呢?向下面这种方式:

void Callback(){    func();}

答案很显然意见:对于void Callback(void (*func)()) 我们可以传入任意一个函数指针,从而在内部调用它。通过这种方式,我们就可以实现如下功能:

  • 当发生某种事件时,系统或其他函数将会自动调用你定义的一段函数。
  • 回调函数就相当于一个中断处理函数,由系统在符合你设定的条件时自动调用。为此,你需要做三件事:1,声明;2,定义;3,设置触发条件,就是在你的函数中把你的回调函数名称转化为地址作为一个参数,以便于系统调用。

看完了什么叫回调函数,我们来看一下回调函数的使用方法。
我们都知道函数名其实就是一段地址。每次我们执行到一个函数的时候,程序会先将当前的状态压栈,这个叫保存现场。
然后程序跳转该地址,这个地址就是函数的入口。函数执行完后,之前保存的状态会弹出,这个过程叫恢复现场。
上面的例子,就是传入了函数的地址,我们在某种意义上可以把它和函数参数的按地址传递划等号。

所以,回调函数的使用,即把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。

void Callback(void (*func)())

对,就是函数指针。
我们这样来定义一个函数指针:

void (*func)(args....)

args代表传入的参数。
上面的例子回调函数中函数指针的参数为空。如果要使用一个带参数的函数指针,那么这个回调函数该怎么写呢?

//定义带参回调函数void func(char* s) {    printf(s);}//定义实现带参回调函数的"调用函数"void Callback(void (*func)(char*),char* s){    func(s);}//在main函数中实现带参的函数回调int main(int argc,char* argv[]){    Callback(func,"Hello World!\n");    return 0;}

这是C语言中的回调函数的简单使用。C++中的回调函数比C语言中要复杂一些,因为C++在C语言基础上引入了很多新特性。
关于C++的回调函数的其他特性我不熟悉,说多了怕误人子弟,就不多嘴了。
如果学过了VC++的MFC,那么你应该知道MFC中有着大量的回调函数的使用,MFC的消息响应机制便是建立在回调函数的基础。


这里说一下MFC和Qt,MFC写起来相比于Qt要麻烦些……Qt的信号/槽机制用着特别舒服,只可惜不是标准C++的内容,而是在C++标准上进行的扩充。要是能在C++17标准中加入……这只是一个美好的幻想。

希望这篇文章能给你一点帮助


PS:这是我在CSDN写的第一篇博客。我想说CSDN在有些方面的用户体验做的不是一般的烂!!
本来这篇文章早就写好了,愣是被卡在审核阶段过不去,问了下度娘才知道文章里估计是有敏感词!!
有敏感词怎么办?找啊,找出来删掉。
席八!找估计一小时我也没发现哪里写的敏感了。
没办法,只有肉身Debug了。
像打断点那样,一句一句的看。找了估计两小时,终于找到两个地方,删除了不被卡审核。
关键是到最后我也不知道为什么那两句会是敏感词!!
日了狗了,有问题你后台啥也不说,让用户自己去猜???

0 0
原创粉丝点击