天天看點

手把手教你寫回調函數

                                        手把手教你寫回調函數

手把手教你寫回調函數

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

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

name: registtimer

注冊鬧鐘處理函數。由于鬧鐘時間到之後,不同的人處理函數不同

是以,這裡隻提供接口,并不實作處理函數邏輯。

調用接口者需要自己實作處理函數,并注冊啟動鬧鐘

void registtimer(tmfun f){

tmstruct.t fun = f;

}

name; starttimer

根據參數設定時間并啟動定時器

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就是可執行程式。

手把手教你寫回調函數

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

版權申明:

轉載文章請注明原文出處http://blog.csdn.net/feiyinzilgd/archive/2010/12/31/6110811.aspx

并請聯系譚海燕本人或者前往譚海燕個人首頁留言

繼續閱讀