咱們的平常開發中會發現有時候使用回調函數能方便的提升程序兼容性和擴展性,那麼具體回調函數怎麼使用呢,下面作個筆記,有不正確的地方,歡迎指出。函數
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了
好了,簡單的回調函數使用就說到這了,有不對的地方,請指正。