回调函数的相关知识点

1,:为什么想彻底解决回调函数

前好长一段时间看过孙鑫老师的c++的深入浅出,在没有基础的情况下,囫囵吞枣的看了几遍,很多理解起来很吃力。后来花了很长一段时间打基础,现在打算以后几个月重新彻底的读懂这本书,马上就要开始学习第一章了,记得当时的windows运行机制和mfc的封装讲的很精彩,即的当时的那个回调函数好像是windows运行机制的核心,所以专门的讲这个回调函数的所有知识点罗列出来

大致的列举的过程主要通过回忆的方式,那本书以前看了不下5遍,主要是基础不扎实导致很多知识点不能完全的理解,主要的学习过程

     1、当时是怎么理解回调函数的

     2、找资料,完善回调函数

     3、找出当时理解的偏差

     4、彻底理解回调函数,并且写出一个回调函数

     5、做个总结

2:当时是怎么理解回调函数的

     当时理解回调函数就是一个函数的指针,就是按照__stdcall标准定义了一个返回值是指定数据类型的指针,这个函数有固定的参数,写成格式如下

T __stdcall  *fun1(a,b,c,d)
     将回调函数记成fun1,假使调用函数是fun2,在fun1里面写入一些处理过程,可以是消息,可以是多线程的处理过程等等,然后将fun1的地址&fun1返回出去,作为参数传递给fun2,

3:找资料,完善回调函数

     通过百度,找到很多关于回调函数的介绍

其实回调就是一种利用函数指针进行函数调用的过程.  //可以理解为回调函数的指针就是调用函数的一个参数  

为什么要用回调呢?比如我要写一个子模块给你用,   来接收远程socket发来的命令.当我接收到命令后,   需要调用你的主模块的函数,   来进行相应的处理.但是我不知道你要用哪个函数来处理这个命令,     我也不知道你的主模块是什么.cpp或者.h,   或者说,   我根本不用关心你在主模块里怎么处理它,   也不应该关心用什么函数处理它......   怎么办?

使用回调!     //回调函数更方便的处理的函数自己的问题,只需要编写好函数就可以了,不必关心调用回调函数的函数情况

—— lone wolf

使用回调函数实际上就是在调用某个函数(通常是API函数)时,将自己的一个函数(这个函数为回调函数)的地址作为参数传递给那个函数。而那个函数在需要的时候,利用传递的地址调用回调函数,这时你可以利用这个机会在回调函数中处理消息或完成一定的操作。   //这一点和我原先的理解一致

—— 某专家

回调函数,就是由你自己写的。你需要调用另外一个函数,而这个函数的其中一个参数,就是你的这个回调函数名。这样,系统在必要的时候,就会调用你写的回调函数,这样你就可以在回调函数里完成你要做的事。 //这一点和我原先的理解一致

—— 绿叶

什么是回调函数?
  回调函数是应用程序提供给Windows系统DLL或其它DLL调用的函数,一般用于截获消息、获取系统信息或处理异步事件。应用程序把回调函数的地址指针告诉DLL,而DLL在适当的时候会调用该函数。回调函数必须遵守事先规定好的参数格式和传递方式,否则DLL一调用它就会引起程序或系统的崩溃。通常情况下,回调函数采用标准WindowsAPI的调用方式,即__stdcall,当然,DLL编制者可以自己定义调用方式,但客户程序也必须遵守相同的规定。在__stdcall方式下,函数的参数按从右到左的顺序压入堆栈,除了明确指明是指针或引用外,参数都按值传递,函数返回之前自己负责把参数从堆栈中弹出。
  理解回调函数!       //找到了回调函数就是普通的返回指针的函数,并且发现新问题,他的stdcall调用方式是可以改变的,压栈和出栈和一般函数类似

—— jufengfeng


4:找出当时理解的偏差

大致理解和当时的理解一样,一句话概括就是一个返回地址的函数

5:彻底理解回调函数,并且写出一个回调函数

     这里摘抄了csdn上的程序员”灵魂“的代码片段,大致做个详细的解释 ,代码如下

#include <stdio.h>
 
void printWelcome(int len)                
{
       printf("欢迎欢迎 -- %d/n", len);
}
 
void printGoodbye(int len)                 

{
       printf("送客送客 -- %d/n", len);
}
 
void callback(int times, void (* print)(int))    
{
       int i;
       for (i = 0; i < times; ++i)
       {
              print(i);
       }
       printf("/n我不知道你是迎客还是送客!/n/n");
}
void main(void)
{
       callback(10, printWelcome);
       callback(10, printGoodbye);
       printWelcome(5);
}

6:总结

回调,字面意思就是返回指针,然后调用



    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值