咱们的平常开发中会发现有时候使用回调函数能方便的提升程序兼容性和扩展性,那么具体回调函数怎么使用呢,下面作个笔记,有不正确的地方,欢迎指出。函数
1、C语言中的使用方法spa
首先使用回调函数,就会用到怎么注册回调函数这个问题。你须要告诉底层代码,它须要调用的函数是什么。那么就得事先定义好回调函数的类型。code
如:blog
typedef void (*eventHandler_f) (int param);
而后定义实现你的注册函数。注册函数的做用就是告诉底层代码,使用者想让你调用的函数是那个开发
#define MAX_ID 3
static eventHandler_f eventHandlerCallbakc[MAX_ID] = {NULL, NULL, NULL};
int registerEventHandle(int id, eventHandler_f eventHandler);
int registerEventHandle(int id, eventHandler_f eventHandler)
{
if (id > MAX_ID) {
return -1;
}
eventHandlerCallback[id] = eventHandler;
return 1;
}
注册函数也提供给使用者了,那么使用者只须要按照定义好的回调函数类型定义本身功能,而后使用注册函数注册就ok了。回调函数
例如:io
static void printData(int data) { printf("print data [%d]", data); }
registerEventHandle(0, printData);
那么咱们已经提供给了对方注册回调的函数,对方也已经注册他须要咱们处理调用的功能函数了,那么咱们怎么去使用这个回调函数呢?很简单,就像普通的调用就能够了编译
例如:event
Int updateData(int data) { //假如达到某些你须要的条件,而后更新数据 int parm = data; for(int i = 0; i < MAX_ID; i++) { if (eventHandlerCallback[i] != NULL) { eventHandlerCallback(data); } } }
2、C++中使用回调函数的方法function
使用步骤和上面C中的过程相似,下面简单举例说明一下。
定义回调函数类型
#include <tr1/functional> typedef std::tr1::function <int (int value)>eventHandler_f;
定义实现注册函数
#define MAX_ID 3 static eventHandler_f eventHandlerCallbakc[MAX_ID] = {NULL, NULL, NULL}; void registerEventHandler(eventHandler_f eventHandler); void registerEventHandler(int id, eventHandlerCallback eventHandler) { if (id > MAX_ID) { return -1; } eventHandlerCallback[i] = eventHandler;
return 1; }
使用注册回调函数设置回调
using namespace std::tr1::placeholders; //必定要使用这个命名空间,否则编译不过 int printData(int data) { cout<<"printf data [%d]\n"<<data; return 1; } registerEventHandler(std::tr1::bind(&printData, _1));
那么咱们已经提供给了对方注册回调的函数,对方也已经注册他须要咱们处理调用的功能函数了,接下来怎样去调用它,就像上面C中的同样使用就ok了
好了,简单的回调函数使用就说到这了,有不对的地方,请指正。