手把手教你寫回調函數
手把手教你寫回調函數源代碼
回調函數的主要功能就是提供統一的接口以及事件的通知。如果你是從事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
并請聯系譚海燕本人或者前往譚海燕個人首頁留言