㈠ 什么是回调函数,英文用callback,为什么叫回调函数,有什么实际的功能
别人写了一个函数,用来下载你的电话本。保存到一个文件里面。
别人的函数(参数1,参数2)
然后你使用这个函数。每次调用之后,电话本就被保存到指定文件里面了。
使用一段时间你会感觉,只是用这个函数是不错,不过不知道下载的进度啊。
所以你就会要求把进度情况告诉你。
然后他就改进了一下
别人的函数(参数1,参数2,回调函数)
并且告诉你回调函数的格式如下
回调函数(参数1:当前数量,参数2:总数量)
你使用时必须按照这个格式定义一个函数,然后传给他。
如下,别人的函数(参数1,参数2,你写的回调函数名字)
这样,你每次调用别人的函数的时候,你写的那个回调函数就会被调用(如何调用是别人控制的了,你只需要在你的函数里面处理好参数1 2就行了)
当然,很多时候回调是不分彼此的,这里写的别人,和自己,只是为了好理解,意思就是表示2个调用和被调用的关系
剩下的你自己体会吧。
PS,你拿国王与饭举例,实在有些牵强。
㈡ c语言回调函数究竟有什么用处我觉的用普通的函数调用替换也可以,谢谢
从功抄能上来说 普通函数也是可以袭的
但在比较大的程序设计中 会对很多功能模块进行封装
比如 上层一个模块
底层一个模块
同时规定,上层可以调用底层的函数,但是底层不可以调用上层函数。
这时就需要使用回调函数。
通过上层调用底层的注册回调借口,传入回调指针。
实现底层通知上层的作用。
另外 回调函数的一个好处是,可以通过回调函数,调用不同接口。
比如接收数据,不同数据需要不同的解析函数。
但是接收数据的流程是相同的
这样 使用回调函数,在接收数据的时候就可以不用判断,而是自动使用不同的解析函数。
总之 使用回调函数,可以降低耦合,实现多样性。
㈢ 怎么理解回调函数回调函数有什么好处
你就想象你函数的一部分功能被外包给别人。至于被人怎么实现的你不用管,你的函数具有一个完整的功能,但是有的功能可以随你自己定制,参照stl中的for_each
㈣ 为什么要使用回调函数
回调函数和一般的指针传递其实没什么区别,你想让strcpy拷贝你指定的字符串,那就传个字符传指针;如果你想让某个函数执行你自定义的函数,就传函数指针……
回调函数,是应付某一类需求最自然的方法,你为什么不问“为什么strcpy要穿个char*?为什么不换种方法呢?”
㈤ 什么是回调函数
回调函数就是一个通过函数指针调用的函数。
如果把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,那就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
不管怎么说,回调函数是继承自C语言的。在C++中,应只在与C代码建立接口或与已有的回调接口打交道时,才使用回调函数。除了上述情况,在C++中应使用虚拟方法或仿函数(functor),而不是回调函数。
(5)串口回调函数有什么用扩展阅读
回调函数的好处:
1、回调函数可以把调用者与被调用者分开,所以调用者不关心谁是被调用者。它只需知道存在一个具有特定原型和限制条件的被调用函数。简而言之,回调函数就是允许用户把需要调用的函数的指针作为参数传递给一个函数,以便该函数在处理相似事件的时候可以灵活的使用不同的方法。
2、回调可用于通知机制。例如,有时要在A程序中设置一个计时器,每到一定时间,A程序会得到相应的通知,但通知机制的实现者对A程序一无所知。那么,就需一个具有特定原型的函数指针进行回调,通知A程序事件已经发生。实际上,API使用一个回调函数SetTimer()来通知计时器。
㈥ 回调函数和普通函数有什么区别
普通函数与回调函数主要是在调用方式上有区别:
1、对普通函数的调用:调用程序发出对普通函数的调用后,程序执行立即转向被调用函数执行,直到被调用函数执行完毕后,再返回调用程序继续执行。从发出调用的程序的角度看,这个过程为“调用-->等待被调用函数执行完毕-->继续执行”。
2、对回调函数调用:调用程序发出对回调函数的调用后,不等函数执行完毕,立即返回并继续执行。这样,调用程序执和被调用函数同时在执行。当被调函数执行完毕后,被调函数会反过来调用某个事先指定函数,以通知调用程序:函数调用结束。这个过程称为回调(Callback),这正是回调函数名称的由来。
一般函数(General function)是相对于比较特殊,比较少见的函数而言的,在任一学科内,指的是作用能力比较基层,使用比较普遍的函数,但同时它也是构成某整个作用域中不可缺少的元素。列如:c语言中的printf(),scanf()函数就是c语言中的一般函数,它们用于各类数据输出和输入,是很常用的的库函数,基础但很重要。
㈦ 回调函数的用法和好处
函数调用形式本身没有好坏之分
任何函数代码如果有错误都可能导致软件出问题,甚至导致崩溃
c 里可以使用指针,函数指针
这就使程序可以更灵活
当 函数指针 做为函数的参数,传递给一个被调用函数,
被调用函数就可以通过这个指针调用外部的函数,这就形成了回调
windows程序中 WndProc 就是使用回调的典型形式
一般的程序中回调函数作用不是非常明显,可以不使用这种形式
最主要的用途就是当函数不处在同一个文件当中,比如动态库,要调用
其他程序中的函数就只有采用回调的形式
#include "stdio.h"
#include "conio.h"
int add(int a, int b);
int libfun(int (*pDis)(int a, int b));
int main(void)
{
int (*pfun)(int a, int b);
pfun = add;
libfun(pfun);
}
int add(int a, int b)
{
return a + b;
}
int libfun(int (*pDis)(int a, int b))
{
int a, b;
a = 1;
b = 2;
printf("%d", pDis(a, b));
}
现在这几个函数是在同一个文件当中
假如
int libfun(int (*pDis)(int a, int b))
是一个库中的函数,就只有使用回调了,通过函数指针参数将外部函数地址传入
来实现调用
函数 add 的代码作了修改,也不必改动库的代码,就可以正常实现调用
便于程序的维护和升级
㈧ 什么引起串口中断
SBUF中的数据发送完毕,TI传送结束标志置1,如果设置了ES=1(串口中断是允许的),就进入串口中断服务程序。解决方法如下:
1、首先打开Cube工程,在Pinout页使能需要使用的串口。
㈨ cc2541中回调函数是什么意思
所谓回调函数,就是由事件或中断触发的相关处理函数执行完后,可调用用户指定的用户处理函数。这种回调函数是系统事件处理函数为用户编程,进行事件的用户级处理保留的接口,回调函数的格式是固定的,通常情况下回调函数指针被赋值成NULL,表示没有用户回调函数,当用户需要增加自己的处理函数时(比如串口接收信息后用户需要处理串口数据时),就按照指定回调函数的格式,写一个自己的处理函数,然后将这个函数的地址赋值给回调函数指针,当系统处理事件时,发现回调函数指针不为NULL了,就执行其指向的函数,这样,用户的处理函数就会在事件发生时得到一次执行。
㈩ 如何理解回调函数的作用与实现
回调函数的主要作用:
1.回调函数就是本模块实现的回调函数,但是调用却不是自己来调,而是由别的模块来调的
2.可更好的把握调用函数的时机,
回调函数依赖对应注册回调的模块,回调函数由该模块触发,触发的条件、时间点,都是由该模块控制
(通常由该模块的事件消息,触发)
3.在不同模块间进行使用,可令触发逻辑与业务逻辑分离,让代码功能性上更为清晰,易懂
注意点:
回调函数跑的事情,都是在触发回调的线程下进行的,如果回调函数中干很多事,很容易造成触发模块-所属线程堵塞
这对于多线程编程时,需特别注意,线程堵塞,会影响其他线程运行时序,造成一些bug
通常用法:
以库的形式,供别人调用实现
以上是根据网上相应资料,再加上自己的总结体会,整理出来的
下面是自己写的一个回调函数-用法的例子:
主要 分成2个模块
A模块为定义回调函数的模块,负责触发回调,一般为事件消息模块
B模块为实现回调函数的模块,一般为处理业务逻辑模块
A模块需向B模块暴露定义及注册回调接口
typedef void (*TestCB)(char testData);
void A_SetTestCb(TestCB pTestCb)
B模块实现具体的回调函数就可以了,本例中即B_UserTestCbDetail(char testData)
主要分3步:注册回调函数->消息事件触发回调函数->执行回调函数
附代码:
#include "stdio.h"
//定义回调函数-别名,方便后续使用------需提供给模块B
typedef void (*TestCB)(char testData);
//模块A内部的全局回调变量,用于模块A内部绑定注册回调用
TestCB g_pTestCbHandle;
/*****************************************************
模块A对外函数---------需提供给模块B
模块A内部定义的全局callback变量与外部模块注册的
回调函数绑定起来,用于后续模块A,满足触发条件后,触
发回调
******************************************************/
void A_SetTestCb(TestCB pTestCb)
{
g_pTestCbHandle = pTestCb;
}
/*****************************************************
模块A内部函数
通常为A模块因为某些条件符合了,触发了对应的事件
从而调用对应的callback函数
******************************************************/
void A_CallTestCb()
{
char testData = 100;
//触发调用回调实现函数
g_pTestCbHandle(testData);
}
/*****************************************************
模块B内部函数
模块B实现的回调函数-具体操作
******************************************************/
void B_UserTestCbDetail(char testData)
{
printf("step 3\n");
printf("[do] call-back\n");
//具体实现
printf("UserTestCbDetail, call back is achieve! testData = %d\n", testData);
}
void main()
{
printf("step 1\n");
printf("[register] call-back\n");
A_SetTestCb(B_UserTestCbDetail);
printf("step 2\n");
printf("[call] call-back\n");
A_CallTestCb();
}