C语言中的指针之回调函数

来源:互联网 发布:汕头公车实时软件 编辑:程序博客网 时间:2024/05/09 13:29

      C语言中的函数也有自己的入口地址。毕竟对于CPU来说,函数只不过是一组有序的内存段。只要按步就班的执行即可。
      函数的入口地址也可用指针来操作,这便是回调函数的本质。
说完本质,应该说现象了,毕竟本质一般都是简单的,现象却是复杂的。
1,适用场景介绍分析
    首先调用者,就是上层写程序的人,要写一个函数接收下层传过来的数据。(这里面所谓的上层下层是指人人之间的团队合作的上层下层)。   
    上层的人要接收数据,而下层的人要把数据接收过来(一般是下层的人从驱动层接收数据)传给上层。这是基本思路 。
    即:上层---------下层---------驱动。中间传输的是data.
    这种传输方式首先让人想到memcpy。如果是这样的话,那就效率太低了。要知道内存的拷贝可是最浪费资源的。
    怎么能让上层的人通过下层,直接接收驱动层传过来的数据呢?
    这就用到了回调函数。
    上层的人写一个接收函数,把其函数的指针传给下层,下层通过其指针操作接收函数。
      这样各模块相对独立,效率又很高。
      2,实现

     假设有一个函数int func(char *buf, int len),做为上层与下层函数交互的函数。所谓的上层与下层,是指两个人共同合作的层。

    上层的要用此函数做为接收下层传过来的数据,而下层的人要使用此函数向上层传递。

下层操作:

     那么下层的人要定义一个回调函数。

    typedef int (*func)(char *buf, int len);

    与正常的操作仅仅差了一个*。这是因为我们要用此函数的指针。

    之后写一个接口,供上层使用。例如:int setcbk(func datacallback);

    这时下层与上层的接口使用完成。

    之后就是下层应该怎么调用,

    例如:

        定义一个static func __g_cbk_func;

     __g_cbk_func(buf, len);此行为从驱动层接收数据。

上层操作:

   首先应该 把要使用的函数传递给下层:

  例如:setcbk(rev_data_func)

     再就是在rev_data_func(char *buf, int len)中接收数据。

至此回调函数完成。

唉,说的比较乱。总之一句话,上层把函数的指针传递给下层使用,下层拿到函数指针用来进行所定义的操作。




原创粉丝点击