C语言回调函数熟练---使用方法(构建程序框架方便好用)
2013-10-23 16:40
351 查看
//少占鱼 河北正定欢迎您 长沙航空职业技术学院 QQ:411656434
通俗点不行吗?啊,不行吗?老外把国人玩的都不是人了。国人还自己玩自己。非把一个简单的东西复杂化。叫那么难理解!!窝里斗。。。。。。典型!!!!!!!! 不说那么复杂的,谁是狗屎,猪屎。就说怎么用回调。
使用步骤:
1.写一个函数A,A里面有一个参数是个指针函数 比如: int shao(int a,int (*Pcall)(void *p))
2.有个指针函数参数,那他要指向一个函数,OK,写一个符合格式的函数B 比如 int CaoDan(int c)
3.使用A函数吧,参数赋值后,指针指向了一个函数地址,不就调用了吗 比如 shao(36,CaoDan);
说明:A通过指针调用了B函数,函数执行语句里面,要用到指针才行啊。不然,光指向了。有个屁用啊!!
int shao(int a,int (*Pcall)(void *p))
{
int PA;
int PS;
(*Pcall)(a); //指针函数的参数赋值,就看你了。想赋值谁都行。
(*Pcall)(PS);
(*Pcall)(PA);
}
void main()
{
shao(3,AFuc);//指向具体函数AFunc首地址
shao(5,BFuc);
}
完毕,就是这么用的。
简单说:函数参数里有函数指针,指针指向的是函数地址,不是变量地址。这样,函数你就可以随便写,都可以用这个回调函数当一个参数来调用,多方便。程序通用性就更强了!!!哇哇哇!!!!
//注意:指针函数写法,*函数名要用括号括起来啊
/****************************************************************************/
简单举例: void Callback_shao(int a , int (*diaoba) (int a,int b))//指针函数直接在参数里声明 { int can;
(*diaoba)(can,a);//要用这指针函数啊,而且参数要赋值
(*diaoba)(22,33); //参数要赋值 (*diaoba)(a,can);//指针函数的参数写什么,就随便你了 } 这个指针参数,到时候指向哪个函数。函数里面执行的,就是哪个函数
//下面是具体函数
void nixie(int fan , int cao) //函数1,参数个数符合回调函数的那个指针函数
{ 里面随便你啦!!。。。。}Void nixiangxie(int mei ,int zhao)//函数2{ 里面随便你啦。。。。}void main() //主函数{ Callback_shao(1,nixie); //回调时,只写函数名就行了。指针嘛,类似指向数组首地址写法 Callback_shao(324,nixiangxie);}/****************************************************************************/
也可以用typedef 自定义,下面使用指针函数就可以直接用函数名了
typdef int(*diaoba) (int a,int b);
diaoba PCallA;//重新定义一个函数指针
diaoba PcallB;
void Callback_shao(int a ,PcallB); //参数里就可以直接写函数名
主函数里。。。。
void main
{
Callback_shao(3,nixie);
}
/**************************************************************/
回调函数例子:[align=left]#include <stdio.h>[/align][align=left][/align][align=left]void printWelcome(int len) //函数实现,回调函数会调用它,要自己先写好。[/align][align=left]{[/align][align=left] printf("Welcom -- %d\n", len);[/align][align=left]}[/align][align=left] [/align][align=left]void printGoodbye(int len) //函数实现,回调函数会调用它,要自己先写好。
{[/align][align=left] printf("Goodbye -- %d\n", len);[/align][align=left]}[/align][align=left] [/align][align=left]void callback(int times, void (* print)(int)) //回调函数,有个参数是个函数指针[/align][align=left]{[/align][align=left] int i;[/align][align=left][/align][align=left] print(i);//指针函数你要用到他,不用它,他回调个屁啊!!
print(times);//指针函数你要用,不用它,他回调个屁啊!!!
[/align][align=left]}
[/align][align=left]void main(void)[/align][align=left]{[/align][align=left] callback(10, printWelcome); //传入具体的函数地址
callback(10, printGoodbye);//传入具体的函数地址[/align][align=left] printWelcome(5);[/align][align=left]}
[/align]/******************************************************************************************************************/
回调函数的写法,还有几种,下面的参考
#include<stdio.h>// 方法指针的格式为:int (*ptr)(char *p) 即:返回值(指针名)(参数列表)
typedef int (*CallBackFun)(char *p); // 为回调函数命名,类型命名为 CallBackFun,参数为char *p 。
程序举例: typedef int (*CallBackFun)(char *p); //这是回调函数,自定义成了一个别名CallBackFunint Afun(char *p)
{
printf("Afun 回调打印出字符%s!\n", p);
return 0;
}
int Cfun(char *p)
{ // 方法 Bfun,格式符合 CallBackFun 的格式,因此可以看作是一个 CallBackFun
printf("Cfun 回调打印:%s, Nice to meet you!\n", p);
return 0;
}[align=left][/align]/*********************************************************************///调用者要先写好这个回调函数的实例。才能调用 回调函数。回调函数相当于制定规则的,但具体函数体,函数名,函数实现不细化,具体细则还得调用者自己实现(即回调函数的实现)。
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;
}
通俗点不行吗?啊,不行吗?老外把国人玩的都不是人了。国人还自己玩自己。非把一个简单的东西复杂化。叫那么难理解!!窝里斗。。。。。。典型!!!!!!!! 不说那么复杂的,谁是狗屎,猪屎。就说怎么用回调。
使用步骤:
1.写一个函数A,A里面有一个参数是个指针函数 比如: int shao(int a,int (*Pcall)(void *p))
2.有个指针函数参数,那他要指向一个函数,OK,写一个符合格式的函数B 比如 int CaoDan(int c)
3.使用A函数吧,参数赋值后,指针指向了一个函数地址,不就调用了吗 比如 shao(36,CaoDan);
说明:A通过指针调用了B函数,函数执行语句里面,要用到指针才行啊。不然,光指向了。有个屁用啊!!
int shao(int a,int (*Pcall)(void *p))
{
int PA;
int PS;
(*Pcall)(a); //指针函数的参数赋值,就看你了。想赋值谁都行。
(*Pcall)(PS);
(*Pcall)(PA);
}
void main()
{
shao(3,AFuc);//指向具体函数AFunc首地址
shao(5,BFuc);
}
完毕,就是这么用的。
简单说:函数参数里有函数指针,指针指向的是函数地址,不是变量地址。这样,函数你就可以随便写,都可以用这个回调函数当一个参数来调用,多方便。程序通用性就更强了!!!哇哇哇!!!!
//注意:指针函数写法,*函数名要用括号括起来啊
/****************************************************************************/
简单举例: void Callback_shao(int a , int (*diaoba) (int a,int b))//指针函数直接在参数里声明 { int can;
(*diaoba)(can,a);//要用这指针函数啊,而且参数要赋值
(*diaoba)(22,33); //参数要赋值 (*diaoba)(a,can);//指针函数的参数写什么,就随便你了 } 这个指针参数,到时候指向哪个函数。函数里面执行的,就是哪个函数
//下面是具体函数
void nixie(int fan , int cao) //函数1,参数个数符合回调函数的那个指针函数
{ 里面随便你啦!!。。。。}Void nixiangxie(int mei ,int zhao)//函数2{ 里面随便你啦。。。。}void main() //主函数{ Callback_shao(1,nixie); //回调时,只写函数名就行了。指针嘛,类似指向数组首地址写法 Callback_shao(324,nixiangxie);}/****************************************************************************/
也可以用typedef 自定义,下面使用指针函数就可以直接用函数名了
typdef int(*diaoba) (int a,int b);
diaoba PCallA;//重新定义一个函数指针
diaoba PcallB;
void Callback_shao(int a ,PcallB); //参数里就可以直接写函数名
主函数里。。。。
void main
{
Callback_shao(3,nixie);
}
/**************************************************************/
回调函数例子:[align=left]#include <stdio.h>[/align][align=left][/align][align=left]void printWelcome(int len) //函数实现,回调函数会调用它,要自己先写好。[/align][align=left]{[/align][align=left] printf("Welcom -- %d\n", len);[/align][align=left]}[/align][align=left] [/align][align=left]void printGoodbye(int len) //函数实现,回调函数会调用它,要自己先写好。
{[/align][align=left] printf("Goodbye -- %d\n", len);[/align][align=left]}[/align][align=left] [/align][align=left]void callback(int times, void (* print)(int)) //回调函数,有个参数是个函数指针[/align][align=left]{[/align][align=left] int i;[/align][align=left][/align][align=left] print(i);//指针函数你要用到他,不用它,他回调个屁啊!!
print(times);//指针函数你要用,不用它,他回调个屁啊!!!
[/align][align=left]}
[/align][align=left]void main(void)[/align][align=left]{[/align][align=left] callback(10, printWelcome); //传入具体的函数地址
callback(10, printGoodbye);//传入具体的函数地址[/align][align=left] printWelcome(5);[/align][align=left]}
[/align]/******************************************************************************************************************/
回调函数的写法,还有几种,下面的参考
#include<stdio.h>// 方法指针的格式为:int (*ptr)(char *p) 即:返回值(指针名)(参数列表)
typedef int (*CallBackFun)(char *p); // 为回调函数命名,类型命名为 CallBackFun,参数为char *p 。
程序举例: typedef int (*CallBackFun)(char *p); //这是回调函数,自定义成了一个别名CallBackFunint Afun(char *p)
{
printf("Afun 回调打印出字符%s!\n", p);
return 0;
}
int Cfun(char *p)
{ // 方法 Bfun,格式符合 CallBackFun 的格式,因此可以看作是一个 CallBackFun
printf("Cfun 回调打印:%s, Nice to meet you!\n", p);
return 0;
}[align=left][/align]/*********************************************************************///调用者要先写好这个回调函数的实例。才能调用 回调函数。回调函数相当于制定规则的,但具体函数体,函数名,函数实现不细化,具体细则还得调用者自己实现(即回调函数的实现)。
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;
}
相关文章推荐
- C语言回调函数熟练---使用方法(构建程序框架方便好用)
- 本程序演示了C语言中回调函数的使用方法
- 回调函数使用方法--例子程序(转载)
- C语言使用函数指针跳转到程序固定地址(0x8000)执行程序的方法
- 使用Python的Twisted框架构建非阻塞下载程序的实例教程
- Linux 程序开发打印 Debug 信息的使用技巧--C语言中几种输出调试信息的方法
- Ubuntu下用glade和GTK+开发C语言界面程序(三)——学习make的使用方法
- 使用Python的Twisted框架构建非阻塞下载程序的实例教程
- Android studio 简单方便的使用JNI调用c语言中的方法
- C语言获得命令行参数的方法,程序总是可以使用命令行参数吗?
- 回调函数使用方法--例子程序
- 如何在Visual Studio 2017中使用C# 7+语法 构建NetCore应用框架之实战篇(二):BitAdminCore框架定位及架构 构建NetCore应用框架之实战篇系列 构建NetCore应用框架之实战篇(一):什么是框架,如何设计一个框架 NetCore入门篇:(十二)在IIS中部署Net Core程序
- Linux 程序开发打印 Debug 信息的使用技巧--C语言中几种输出调试信息的方法
- java8 使用Map中的computeIfAbsent方法构建本地缓存,提高程序效率
- 使用C语言获取程序的执行时间的方法-clock函数
- [渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:MVC程序中实体框架的连接恢复和命令拦截
- 【转】 在 .NET 框架程序中通过DllImport使用 Win32 API
- 不安装.net framework框架运行.Net 程序的方法
- qtcreator 调试ros程序,附加到进程无法使用解决方法
- [置顶] Quick Spring——一款在main方法中使用spring语法的敏捷框架