/*********************************************************************/
//調(diào)用者要先寫好這個(gè)回調(diào)函數(shù)的實(shí)例。才能調(diào)用 回調(diào)函數(shù);卣{(diào)函數(shù)相當(dāng)于制定規(guī)則的,但具體函數(shù)體,函數(shù)名,函數(shù)實(shí)現(xiàn)不細(xì)化,具體細(xì)則還得調(diào)用者自己實(shí)現(xiàn)(即回調(diào)函數(shù)的實(shí)現(xiàn))。
int call(CallBackFun pCallBack, char *p) //寫法1,
{ // 執(zhí)行回調(diào)函數(shù),方式一:通過命名方式
printf("call 直接打印出字符%s!\n", p);
pCallBack(p);//指針函數(shù)要寫在里面,不用它,回調(diào)個(gè)屁。。!
return 0;
}
/*********************************************************************/
int call2(char *p, int (*ptr)())
{ // 執(zhí)行回調(diào)函數(shù),方式二:直接通過方法指針
printf("==============\n", p);
(*ptr)(p); //指針函數(shù)要寫在里面,不用它,回調(diào)個(gè)屁。。!
}
/*********************************************************************/
int call3(char *p, CallBackFun pCallBack)
{ // 執(zhí)行回調(diào)函數(shù),方式一:通過命名方式
printf("--------------\n", p);
pCallBack(p); //指針函數(shù)要寫在里面,不用它,回調(diào)個(gè)屁啊。!
}
/*********************************************************************/
int main()
{
char *p = "hello";
call(Afun, p); //調(diào)用Afun回調(diào)函數(shù),傳遞參數(shù)*P給Afun函數(shù)
call(Cfun, p); //調(diào)用Cfun回調(diào)函數(shù),傳遞參數(shù)*P給Afun函數(shù)
call2(p, Afun); //調(diào)用Afun回調(diào)函數(shù),傳遞參數(shù)*P給Afun函數(shù)
call2(p, Cfun); //調(diào)用Cfun回調(diào)函數(shù),傳遞參數(shù)*P給Afun函數(shù)
call3(p, Afun); //調(diào)用Afun回調(diào)函數(shù),傳遞參數(shù)*P給Afun函數(shù)
call3(p, Cfun); //調(diào)用Cfun回調(diào)函數(shù),傳遞參數(shù)*P給Afun函數(shù)
// int i = getchar();
// printf("Input: %c \n", i);
return 0;
}
/*********************************************************************/
Linux下的編譯、輸出:
[jhliu@localhost src]$ gcc -o func_callback func_callback.c
[jhliu@localhost src]$ ./func_callback
call 直接打印出字符hello!
Afun 回調(diào)打印出字符hello!
==============
call 直接打印出字符hello!
Cfun 回調(diào)打印:hello, Nice to meet you!
==============
Afun 回調(diào)打印出字符hello!
==============
Cfun 回調(diào)打印:hello, Nice to meet you!
--------------
Afun 回調(diào)打印出字符hello!
--------------
Cfun 回調(diào)打印:hello, Nice to meet you!
[jhliu@localhost src]$
/*****************下面是少占魚測(cè)試通過的用法舉例(vc6.0)***********************************/
#include "iostream.h"
#define uint8 unsigned int
typedef void (*halCBack_t) (uint8 keys, uint8 state); //指針函數(shù),注意加了自定義typedef后,下面才能重命名
void KeyCallback ( uint8 keys, uint8 state ); //具體實(shí)現(xiàn)函數(shù)
void LEDCallback ( uint8 keys, uint8 state ); //具體實(shí)現(xiàn)函數(shù)
int Ligback( uint8 keys, uint8 state ); //具體實(shí)現(xiàn)函數(shù)
void HalKeyConfig (uint8 st, halCBack_t cback);//注意指針函數(shù)加了typedef后,這里才能當(dāng)關(guān)鍵字聲明
void ShiYong (uint8 ffff, int (*halCBack_t) (uint8 keys, uint8 state));//如果指針函數(shù)沒有typedef,要這樣使用
//注意指針函數(shù)加了自定義typedef后,這里才能定義,否則報(bào)錯(cuò)
halCBack_t pHalKeyProcessFunction=KeyCallback; //聲明指針函數(shù)變量并指向一個(gè)具體函數(shù)地址
halCBack_t taskCall[]=
{
KeyCallback,
LEDCallback
}; //指針函數(shù)數(shù)組
void main()
{
HalKeyConfig( 1, KeyCallback ); //調(diào)用該函數(shù),參數(shù)里的指針函數(shù)指針指向具體函數(shù)即可
HalKeyConfig( 2, LEDCallback );
taskCall[0](11,11);
taskCall[1](22,22);
ShiYong(33,Ligback);
(*pHalKeyProcessFunction)(44,44); //指針函數(shù)具體使用
}
void HalKeyConfig (uint8 st, halCBack_t cback)//某個(gè)函數(shù),調(diào)用指針函數(shù)作參數(shù)
{
cback(st,st);
}
void ShiYong (uint8 fa, int (*halCBack_t) (uint8 keys, uint8 state))
{
(*halCBack_t) (fa, fa);
cout<<"使用"<<endl;
}
void KeyCallback ( uint8 keys, uint8 state ) //具體實(shí)現(xiàn)函數(shù)
{
cout<<"按鍵函數(shù)"<<keys<<state<<endl;
}
void LEDCallback ( uint8 keys, uint8 state ) //具體實(shí)現(xiàn)函數(shù)
{
cout<<"LED函數(shù)"<<keys<<state<<endl;
}
int Ligback( uint8 keys, uint8 state ) //具體實(shí)現(xiàn)函數(shù)
{
cout<<"Lig函數(shù)"<<keys<<state<<endl;
return 1;
}