回调函数求助

dsoyy 2012-05-07 05:42:53
最近才接触到回调函数,不过不太懂,百度了一些资料觉得还是晕乎乎的,哪位朋友可以给一点比较浅显易懂的资料,或者那朋友侠士愿意举例讲解一下什么是回调函数,什么场合使用,执行机制是怎么样的。。。。。。,更是感激不尽啊。
...全文
202 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
自信男孩 2012-05-08
  • 打赏
  • 举报
回复
学习回调函数,需要明白几个概念吧,:1. 回调;2. 函数指针; 3. 调用者和实现者;4. 函数接口; 5. 回调函数。
sundayX 2012-05-08
  • 打赏
  • 举报
回复
回调函数其实就是函数指针的一种使用。

调用方自己定义一个函数,然后把该函数的指针当然被调用方的一个参数,被调用方在处理后,通过调用传递进来的函数,来执行调用方定义的函数代码。

比如调用方定义函数:

void myfunc(int a)
{
//处理
}
被调用方函数:
typedef void (*callback) (int a);
void proc(callback func)
{
//处理
//通过func回调,执行func所指向函数的代码
}

最后,调用方调用被调用方的函数proc
proc(myfunc);
这样就实现回调了。
pathuang68 2012-05-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

就是自己写的函数给系统调用。当你等待的某些事件发生了,系统就给你自动调用了。
[/Quote]

++

比如用MFC写一个按钮的OnClick事件处理函数,那个OnClick时间处理函数就是回调函数。你的任务就是写那个函数,至于那个函数是如何被调用的,你可以不用管。

通常回调函数和函数指针密切相关,但是未必尽然。举个例子:

假定一个系统已经有如下代码:
void message_handler(*****)
{
callbackfun(***);
}

int main(int argc, char**)
{
message_handler(****);
}
也就是说系统肯定会调用message_handler,而在message_handler中又会调用callbackfun,也就是说这一部分是写死了的,程序员通常不能去改动。但是原系统中并不会提供callbackfun,这个callbackfun需要程序员自己去实现。当你实现好了callbackfun后,运行系统,就会自动调用你自己写的那个函数callbackfun了,这个callbackfun就是回调函数。

从上面的分析可以看出,回到函数和函数指针其实并没有直接的联系。但是为了方面,在类似上面的message_handler中,通常用函数指针的机制,来调用回调函数。

关于函数指针的几种常见的用法,可以参考:
函数指针的几种用法
仔细读读,应该会让你对函数指针有一个比较透切和全面的认识。
韦伊 2012-05-07
  • 打赏
  • 举报
回复
回调函数就是自己定义一个函数,MSDN给出模版,函数名可任意,参数个数、参数类型由MSDN规定,你只要照着那个函数模版去实现函数体就可以了,然后传递你所写的函数名到调用处,即可执行你所写的函数体。
  • 打赏
  • 举报
回复
回调函数说白了 就是函数指针的使用。

但是使用场景我接触的大概有这么几种:
(1)你可以看下STL,sort()第三个参数就是函数指针,你可以自己定义元素比较的算法实现为一个函数,然后以函数指针的形式作为参数传递给sort,这样就可以做到sort在排序时候的比较算法采用你自定义的。这样我们可以称第三个参数为回调函数。
这样做有两个原因吧:
第一个当别人给你提供的接口的时候,为了使接口更加灵活,比如上面的可以用户自定义函数;
第二个就是你可以不修改sort源码,只需提供比较函数算法,即可以实现不同目的的排序;

(2)注册
这个我个人觉得是运用最为广泛的了,比如Windows消息机制、可以在程序编译阶段将消息与函数指针关联起来;比如 消息 WM_HELLO和FuncHello(回调函数)注册后;将WM_HELLO和FuncHello注册即可以理解为将其存入一张表结构中;
当你的应用程序执行的时候,产生了一个WM_HELLO消息,这通过查表找到FuncHello并且执行。

(3)和注册类似,在很多的库实现中都会提供这样的接口
以我在Winpcap中的接口为例子吧。
typedef void (*pcap_handler)(u_char *, const struct pcap_pkthdr *,
const u_char *);
int pcap_loop(pcap_t *, int, pcap_handler, u_char *);
这个是Winpcap提供的一个接口,接口作用就是当抓取一个数据包的时候调用用户定义的函数进行处理;
而这个函数就是第三个参数 pcap_handler,这个就是一个函数指针,我们可以称你自己写的pcap_handler函数为回调函数。

这样做的好处显而易见,我们的代码不需要侵入pcap_loop;


可能写的不是很好,但我把知道的和你分享,因为我和楼主当年一样,也为这个概念头疼,虽然只明白就是一个函数指针嘛,却不知道如何使用。。。。
希望能对你有帮助。
PS:随着你程序经验的增加,渐渐会发现很多问题已经不是问题了......
  • 打赏
  • 举报
回复

typedef void (*callback_func) (int a);

void _callback_func(int a)
{
printf("a=%d\n", a);
}

void do_sth(callback_func pf_cbf)
{
if(NULL != pf_cbf)
{
int a=5;
pf_cbf(a);
}
}

void sys()
{
do_sth(_callback_func);//把_callback_func这个函数名当做参数传递给do_sth函数
}

int main()
{
sys();
return 0;
}

上面就是一个回调函数的例子
W170532934 2012-05-07
  • 打赏
  • 举报
回复
就是自己写的函数给系统调用。当你等待的某些事件发生了,系统就给你自动调用了。
恨天低 2012-05-07
  • 打赏
  • 举报
回复
就是函数指针

70,021

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧