关于C语言回调函数的零散问题,先谢谢了……?

可以从函数式编程角度理解一下,不要严格区分数据与函数,只是使用方式不同,数据使用是获取其值,函数使用是运行其代码,两者只是回调对象的特例罢了,你完全可以struct里同时存放数据的指针和函数指针。你也可以把这种叫做注册数据和回调数据啊,而对于数据指针的存放与使用你可能不会产生疑问,对于一些动态语言python,你甚至可能看不出传入的是数据还是函数。在c里这种差异是由于c中函数不是first class造成的。回调函数意义就是保存对象其引用以供后续使用,至于什么注册,回调,系统调用,主动调用都很好理解了。注册就是保存引用,回调就是通过保存的引用后续使用该对象,系统帮你调用就是调用该函数的代码已经又系统写好,你都看不出来系统直接调用,典型的如排序函数里传入的比较函数,你自己并未直接调用他,而是交由排序函数调用了,用户调用就是你自己调用喽。回调这个翻译也值得吐槽一番。
■网友
1. 我想你的意思应该是,Register callback function,注册回调函数。举个例子,你开了一个饭店,招聘的厨师有做川菜,粤菜,鲁菜,西餐等等,饭店为了统一管理,指定了统一的做菜下单要求,比如口味、数量、菜系等(接口),每个厨师都能理解下单要求并告知厨房(注册),那么来了顾客要求不同(事件),就请不同的厨师为之提供服务(回调)。这样的好处是,你的饭店管理不同的厨师,这个过程是不变的,和厨师的行为无关,将做菜的工作抽象后并和厨师实际操作过程分离了(解耦)。想象一下,计算机有各种设备,键盘、鼠标、磁盘、网卡,各种设备有若干功能,若干事件,如果处理这些事件的具体函数和管理分发这些事件的程序耦合在一起,那么任何一个设备功能操作做了改变,管理部分的程序也要做变更,对管理五花八门的设备来说,这就是噩梦了。2.指针变量和指针所指向的内存占用多少空间,这个可以用关键字sizeof求出来,函数指针也不例外: sizeof(pfun), sizeof(*pfun)。可以把函数抽象当作一种变量类型就可以理解,就像int,char一样3. 题主这个问题很含糊。我想你只是不理解函数也可以像变量一样传递的这种方式,直接调用一个函数和使用函数指针调用,本质上是相同的。回调函数的必要性是设计要求,参考问题1回答中的解耦。4. 回调机制是一种设计技巧,很多编程语言都可以实现。
■网友
之前我也看了下回调函数,我就我的了解解释下,不对的地方请指正。回调函数很多地方就解释为函数指针,我觉得那么理解可能更好理解。函数是一个执行处理过程,提供一个入口;而指针就是指向这个执行过程的变量。那么合起来就是用这个指针,能执行这段函数。回调函数具体实现是将一个函数指针作为变量传给系统,然后系统执行过程中会调用这个指针指向函数,从而实现“让系统调用函数”。其实不只是系统,自己写一个程序处理一个函数指针,也能叫做回调函数指针问题1,我的理解是因为回调函数也叫钩子函数,像一个挂上去的过程,也有点像配置,注册表。因此叫注册一个回调函数。一种说法,不用太纠结。问题2,指针所占内存空间都是一样大的,因为它存的是内存地址,具体大小好像32位机是4个字节(也就是32位咯)
问题3,正如前面解释,不从参数穿进去,系统怎么知道你要执行哪个函数呢?反正他就是调用那个参数指向的函数的
问题4,我认为这应该是一种编程思想形成的吧,毕竟编程目标都为了最大限度简易、明了
【关于C语言回调函数的零散问题,先谢谢了……?】 手机回答,有点乱,请海涵

■网友
1.为什么调用一个回调函数时,大量资料里都翻译成“注册一个函数”,他是怎么“注册”的?究竟什么叫做“注册”? “注册”只是概念上的。意思是告诉调用者在有相应需要的时候,调用“这个”函数。具体实现上,通常是注册的时候给一个函数地址。但是也可以使用更特别的方式,比如提供一个字符串,里面是名字,运行时寻找符号表。2.当结构里定义一个函数指针时,例如: typedef struct { ...... void (*pfun)(int p1, double p2);...... } MyStruct; 然后我又声明一个变量: MyStruct example1; 此时这个变量中的函数指针指向的内存空间有多大? 函数指针不是任何神奇的东西。换个情景,比如你声明一个int*变量的时候,会怎么样?3.将函数指针当作参数传递,应该可以用某些方法代替,比如函数中直接调用那个回调函数。有人说,这是“系统帮你调用函数”和“你主动调用函数”的区别,请问本质区别在哪?是在内存分配上吗?回调函数的必要性在哪? 问题是,直接调用哪个回调函数?那个库是另外一个人开发的,回调时的函数是你提供的。4.回调函数的使用只是编程的一种手法吗? 是的。它通常是为了提供一种运行时多态,意思是运行的时候才决定行使什么样的功能。


推荐阅读