来自 金沙js77888 2019-05-02 16:02 的文章
当前位置: 金沙js77888 > 金沙js77888 > 正文

  2、你在敲代码

  在讨论回调函数前我们先看一下一下两种情景。

  1、你在敲代码,中午了,于是你去炒菜,然后敲代码。

  2、你在敲代码,中午了,于是你去炒菜,然后打了个电话给美团,点了份外卖,继续敲代码。

  从代码的角度看,1就是我们平时的功能函数的调用,2是调用回调函数。

  可以看出回调函数一个非常重要的好处就是你的程序变成异步了。也就是你不必再调用这个函数的时候一直等待这个时间的到达、事件的发生或中断的发生(万一一直不发生,你的程序会怎么样?),

再此期间你可以做做别的事情,或者四处逛逛。当回调函数被执行时,你的程序重新得到执行的机会,此时你可以继续做必要的事情了。

  回调函数是一个不被设计者直接调用,而是被其他人回过来调用的函数

  回调是一种非常重要的机制,主要用来实现软件的分层设计,使得不同软件模块的开发者的工作进度可以独立出来,不受时空的限制,需要是通过约定好的接口(或标准)相互契合在一起

  如何可以实现回调机制:

1 void func (void (*p)(void *),void * arg);

   例子:

 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 void my1(void * arg)
 5 {
 6     char * str = (char *)arg;
 7     printf("%sn",str);
 8 }
 9 
10 void my2(void * arg)
11 {
12     char * str = (char *)arg;
13     printf("%dn",strlen(str));
14 }
15 
16 void func(void (*f)(void *), void *p)
17 {
18     f(p);
19 }
20 
21 int main(int argc, char const *argv[])
22 {
23     
24     char * msg = "hello";
25     func(my1,(void *)msg);
26     func(my2,(void *)msg);
27 
28     return 0;
29 }

  运行结果: 

1 hello
2 5

 

  我们并没有直接调用my1和my2这两个函数,而是通过func这个中介来调用他们。

  当然,回调函数也是可以带回返回值的。

1 void * func (void * (*p)(void *),void * arg);

  例子:

 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 void * my1(void * arg)
 5 {
 6     char * str = (char *)arg;
 7     printf("%sn",str);
 8     return (void *)"my1";
 9 }
10 
11 void * my2(void * arg)
12 {
13     char * str = (char *)arg;
14     printf("%dn",strlen(str));
15     return (void *)"my2";
16 }
17 
18 void * func(void *(*f)(void *), void *p)
19 {
20     return f(p);
21 }
22 
23 int main(int argc, char const *argv[])
24 {
25     
26     char * msg = "hello";
27     printf("%sn",func(my1,(void *)msg));
28     printf("%sn",func(my2,(void *)msg));
29 
30     return 0;
31 }

  运行结果:

1 hello
2 my1
3 5
4 my2

   这两种模型都有个共同的特点,含有两类参数,一类是函数指针,另一类是传给回调函数的参数。其中函数指针是必须知道的,只有知道你想要回调的函数才能够调用它。如果回调函数不需要参数则可以传入一个NULL。

 

  什么时候使用回调函数

  不确定该任务何时能触发时

 

 

 

 (侵删)

欢迎大家一起讨论

参考  

 

  

本文由金沙js77888发布于金沙js77888,转载请注明出处:  2、你在敲代码

关键词: js9001.com金沙