閱讀754 返回首頁    go 阿裏雲 go 技術社區[雲棲]


手把手教你寫回調函數

                                        手把手教你寫回調函數

 

 

 

手把手教你寫回調函數源代碼手把手教你寫回調函數源代碼

 

回調函數的主要功能就是提供統一的接口以及事件的通知。如果你是從事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

  上一篇:go VC++數據庫開發技術的比較
  下一篇:go 剖析QTextStream和QDataStream的區別