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