函数指针-回调函数



为什么要用到回调函数?

更高级的语言中,回调函数的形式会发生一些变化,C++中有回调类,C#有委托.
但是本质上都是“你想让别人的代码执行你的代码,而别人的代码你又不能动”这种需求下产生的


假设A模块是需要调用B模块,而B模块又需要调用A模块,我们知道,模块之间的调用需要包含头文件,那模块的相互调用就存在头文件的相互包含,结果,你自己试试就知道了。不相互包含又不行,下面我们给出行不通的方式(我用main.c来模拟A模块,用test.c来模拟B模块):
main.c内容如下:
[cpp]   view plain   copy
  1. #include <stdio.h>  
  2. #include "test.h"  
  3.   
  4. void print();  
  5.   
  6. int main()  
  7. {  
  8.     fun();  
  9.     return 0;  
  10. }  
  11.   
  12. void print()  
  13. {  
  14.     printf("hello world\n");  
  15. }  

test.c内容如下:
[cpp]   view plain   copy
  1. #include <stdio.h>  
  2. #include "test.h"  
  3.   
  4. void fun()  
  5. {  
  6.     printf("test\n");  
  7.     print();  
  8. }  

test.h内容如下:
[cpp]   view plain   copy
  1. void fun();  

      编译不过,因为在test.c中,print函数式不可见的。下面,我们来采用回调函数实现吧(本质是主动把函数地址传过去
):
main.c的内容如
[cpp]   view plain   copy
  1. #include <stdio.h>  
  2. #include "test.h"  
  3.   
  4. void callBackPrint();  
  5.   
  6. int main()  
  7. {  
  8.     fun(callBackPrint);  //注册,把地址传过去。
  9.     return 0;  
  10. }  
  11.   
  12. void callBackPrint()  
  13. {  
  14.     printf("hello world\n");  
  15. }  

test.c的内容如下:
[cpp]   view plain   copy
  1. #include <stdio.h>  
  2. #include "test.h"  
  3.   
  4. void fun(void (*p)())  
  5. {  
  6.     printf("test\n");  
  7.     (*p)();   //回调
  8. }  

test.h的内容如下:
[cpp]   view plain   copy
  1. void fun(void (*p)());  

     可以正确编译运行,现在,懂了回调函数的作用了吧?如此美妙,妙哉妙哉。如果你开发经验非常丰富,你会发现,回调机制无处不在。

    总结一下: 先注册(把函数地址传过去), 后回调(根据传过来的函数地址, 调用函数)。

猜你喜欢

转载自blog.csdn.net/qq_31186123/article/details/79209662