回调函数的一些总结
第一次用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;
}
运行结果: