手把手教你寫回調函數
回調函數的主要功能就是提供統一的接口以及事件的通知。如果你是從事middleware,框架,提供API編程的,那麼你肯定少不了要使用回調函數。
所謂提供統一接口或者事件的通知即:當發生某一事件或者出現某一個狀態之後必定會進行某種操作。但是這個操作又不能寫死,不同的環境不同的程序會有不同的實現,也就是說提供接口的人不想把邏輯寫死,而是由調用接口的人來實現邏輯。這也就是回調函數的主要功能。
回調函數,唯一途徑就是傳遞函數指針。通過這個函數指針來調用真正的函數。
下麵使用代碼說明究竟如何實現回調函數,並通過這個例子來說明回調函數的作用:
/** filename: mytimer.h description: 這裏我用一個鬧鍾靜態庫mytimer.a來演示回調函數的實現方法 */ #ifndef MYTIMER_H #define MYTIMER_H typedef void (*tmfun)(tumfun ); typedef struct{ tmfun t_fun; }tmhandle; static tmhandle tmstruct; extern void starttimer(int intercal); extern void registtimer(tumfun f);
/** filename: mytimer.c description: */ /** name: registtimer description: 注冊鬧鍾處理函數。由於鬧鍾時間到之後,不同的人處理函數不同 所以,這裏隻提供接口,並不實現處理函數邏輯。 調用接口者需要自己實現處理函數,並注冊啟動鬧鍾 */ void registtimer(tmfun f){ tmstruct.t fun = f; } /** name; starttimer description: 根據參數設定時間並啟動定時器 */ void starttimer(int interval){ int tmpi = 0; int fixtim = 500000000; int tmpFix = 0; for(tmpi;tmpi<=interval;tmpi++) for(tmpFix;tmpFix<=fixtim*2;tmpFix++); (*tmstruct.t_fun)(); }
以上是靜態庫的全部代碼
Linux下輸入以下命令製作動態庫:
$ gcc -c mytimer.c $ ar -rc libmytimer.a mytimer.o
測試程序:
/** filename: testtimer.c description: 對接口進行測試,調用靜態庫 */ #include <stdio.h> #include <unistd.h> #include "mytimer.h" /** name:handler description:鬧鍾處理函數,即回調函數 */ void handle(){ printf("Hi Legend, I am a callback/n"); } int main(int argc, char **argv){ registtimer(&handle);//對鬧鍾處理函數進行注冊 starttimer(5); return 0; }
將上麵靜態庫頭文件mytimer.h, libmytimer.a和testtimer.c放到同一個文件夾下麵
然後輸入以下命令:
$ gcc -o testtimer -L./ testtimer.c -lmytimer
然後得到的testtimer就是可執行程序。
版權申明:
轉載文章請注明原文出處https://blog.csdn.net/feiyinzilgd/archive/2010/12/31/6110811.aspx
並請聯係譚海燕本人或者前往譚海燕個人主頁留言
最後更新:2017-04-02 06:51:33