C语言中的回调函数实例
C语言中的回调函数实例
发布时间:2016-12-28 来源:查字典编辑
摘要:在C语言中一般用typedef来为回调函数定义别名(参数名)。别名通过宏定义typedef来实现,不是简单的宏替换。可以用作同时声明指针型的...

在C语言中一般用typedef来为回调函数定义别名(参数名)。 别名通过宏定义typedef来实现,不是简单的宏替换。可以用作同时声明指针型的多个对象。

比如:

复制代码 代码如下:

char *pa,pb;//pa是一个char型指针,但pb是一个char型字符。我们可以这样来实现

typedef char* PCHAR;

PCHAR pa,pb;//pa和pb都是char型指针

先看一个回调函数的例子:

复制代码 代码如下:

#include<stdio.h>

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

typedef int (*CallBackFun)(char *p); //为回调函数命名,类型命名为 CallBackFun,参数为char *p

//方法 Afun,格式符合 CallBackFun 的格式,因此可以看作是一个 CallBackFun

int Afun(char *p)

{

printf("Afun 回调打印出字符%s!n", p);

return 0;

}

// 方法 Cfun,格式符合 CallBackFun 的格式,因此可以看作是一个 CallBackFun

int Cfun(char *p)

{

printf("Cfun 回调打印:%s, Nice to meet you!n", p);

return 0;

}

// 执行回调函数,方式一:通过命名方式,pCallBack可以看做是CallBackFun的别名

int call(CallBackFun pCallBack, char *p)

{

printf("call 直接打印出字符%s!n", p);

pCallBack(p);

return 0;

}

// 执行回调函数,方式二:直接通过方法指针

int call2(char *p, int (*ptr)()) //或者是int call2(char *p, int (*ptr)(char *)) 同时ptr可以任意取名

{

printf("==============n", p);

(*ptr)(p);

}

int main()

{

char *p = "hello";

call(Afun, p);

call(Cfun, p);

call2(p, Afun);

call2(p, Cfun);

return 0;

}

再看一个回调函数的例子:

#include <stdio.h>

typedef void (*callback)(char *);

void repeat(callback function, char *para)

{

function(para);

function(para);

}

void hello(char* a)

{

printf("Hello %sn",(const char *)a);

}

void count(char *num)

{

int i;

for(i=1;i<(int)num;i++)

printf("%d",i);

putchar('n');

}

int main(void)

{

repeat(hello,"Huangyi");

repeat(count, (char *)4);

}

本例中回调函数的参数按什么类型解释由调用者(repeat)规定,实现者(hello,count)就是一个void 指针,实现者只负责将这个指针转交给回调函数,而不关心它到底指向什么数据类型。调用者知道自己传的参数是char 型的,那么在自己提供的回调函数中就应该知道参数要转换成char *型来解释。

推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
相关阅读
网友关注
最新C语言学习
热门C语言学习
编程开发子分类