c语言回调函数的作用域,C语言回调函数熟练---使用方法(构建程序框架方便好用)...

//少占鱼  河北正定欢迎您   长沙航空职业技术学院  QQ:411656434ios

通俗点不行吗?啊,不行吗?老外把国人玩的都不是人了。国人还本身玩本身。非把一个简单的东西复杂化。叫那么难理解!!窝里斗。。。。。。典型!!!!!!!!数组

不说那么复杂的,谁是狗屎,猪屎。就说怎么用回调。使用步骤:

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;ui

(*diaoba)(can,a);//要用这指针函数啊,并且参数要赋值(*diaoba)(22,33);//参数要赋值spa

(*diaoba)(a,can);//指针函数的参数写什么,就随便你了指针

}blog

这个指针参数,到时候指向哪一个函数。函数里面执行的,就是哪一个函数//下面是具体函数get

voidnixie(int fan , int cao) //函数1,参数个数符合回调函数的那个指针函数{回调函数

里面随便你啦!!。。。。

}

Void nixiangxie(intmei,intzhao)//函数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);

}/**************************************************************/

回调函数例子:

#include

void printWelcome(int len)  //函数实现,回调函数会调用它,要本身先写好。

{

printf("Welcom-- %d\n", len);

}

void printGoodbye(int len) //函数实现,回调函数会调用它,要本身先写好。

{

printf("Goodbye-- %d\n", len);

}

void callback(int times, void (* print)(int)) //回调函数,有个参数是个函数指针

{

int i;

print(i);//指针函数你要用到他,不用它,他回调个屁啊!!

print(times);//指针函数你要用,不用它,他回调个屁啊!!!

}

void main(void)

{

callback(10, printWelcome); //传入具体的函数地址

callback(10, printGoodbye);//传入具体的函数地址

printWelcome(5);

}

/******************************************************************************************************************/

回调函数的写法,还有几种,下面的参考

#include

// 方法指针的格式为:int (*ptr)(char *p) 即:返回值(指针名)(参数列表)

typedef int (*CallBackFun)(char *p); // 为回调函数命名,类型命名为 CallBackFun,参数为char *p 。程序举例:

typedef int (*CallBackFun)(char *p);//这是回调函数,自定义成了一个别名CallBackFun

int 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;

}

/*********************************************************************/

//调用者要先写好这个回调函数的实例。才能调用回调函数。回调函数至关于制定规则的,但具体函数体,函数名,函数实现不细化,具体细则还得调用者本身实现(即回调函数的实现)。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<

}

void KeyCallback ( uint8 keys, uint8 state ) //具体实现函数

{

cout<

}

void LEDCallback ( uint8 keys, uint8 state ) //具体实现函数

{

cout<

}

int Ligback( uint8 keys, uint8 state ) //具体实现函数

{

cout<

return 1;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值