回调函数的一些总结

回调函数的一些总结

第一次用Markdown写的博客

  • 回调函数概念
  • 异步
  • 一个简单示例
  • 参考资料

回调函数概念

简单说明 :所谓回调函数,就是使用者定义一个函数,并给出实现;然后将这个函数传递给别人的函数(如系统main()调用)中,由别人的函数运行时通过参数传递方式调用。简单地说,就是你定义的函数,由别人运行时调用。
原理 :回调函数是一个通过函数指针调用的函数。如果你把函数指针(函数的入口地址)传递给另一个函数,当这个函数指针被用来调用它所指向的函数时,我们就说这个函数是回调函数。

异步

回调函数的一个应用就是在于异步事件处理,首先将异步事件发生时需要执行的代码编写成一个函数,并将该函数注册成为回调函数,这样当该异步事件发生时,系统会自动调用事先注册好的回调函数。
回调函数的注册实际上就是将回调函数的信息填写到一个用于注册回调函数的结构体变量中。
各种不同异步事件的回调函数注册方法有所不同。

一个简单示例

#include<stdio.h>
/*************
 * Simple demo of callback function
 * Shizhou
 * 5th Aug.****************/
typedef void (*CBTest)(void *p);

//struct used for register callback func
typedef struct _cbDemo CBDemo;
struct _cbDemo
{
    CBTest cb;  //pointer to callback func
    void *cbParam;  //pointer to callback param
    int i;
};

/**  Register a callback function
 *  @pDemo: used for register callback func
 *  @test:  func registed 
 *  @p: param when callback func is called
 * **/
void RegisterCallback(CBDemo *pDemo, CBTest test, void *p)
{
    pDemo->cb = test;
    pDemo->cbParam = p;
}

typedef struct _Data Data;
struct _Data
{
    int i;
    int j;
};


void Test1(void *p)
{
    ((Data*)p)->i++;
    ((Data*)p)->j++;
}


void Test2(void *p)
{
    ((CBDemo*)p)->i = 66;
}

int main()
{
    CBDemo demo;
    Data data;
    demo.i = 1;
    data.i = 10;
    data.j = 11;
    RegisterCallback(&demo,Test1,&data);//register Test1() as call    back function
    printf("before call Test1():    i=%d, j=%d\n", data.i, data.j); 
    demo.cb(demo.cbParam);  //call callback func
    printf("after call Test1():  i=%d, j= %d\n", data.i, data.j);
    RegisterCallback(&demo,Test2,&demo);//register Test2() as call    back function
    printf("before call Test2(): i=%d\n", demo.i);
    demo.cb(demo.cbParam);  //call callback func
    printf("after call Test2(): i=%d\n", demo.i);

    return 0;
}


运行结果:
Callback 函数运行结果

参考资料

第一个
第二个
第三个

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值