反弹函数是两个做为“模块”被传达的函数。
在C中,反弹函数根本无法采用函数指针同时实现。
在C++、Python等更高阶的词汇中还能采用“仿函数”或“非官方函数”。
反弹大体上是指任何做为HTA给其它标识符的可继续执行标识符,
它被期许在某一的时间被招唤或继续执行该标识符。
如果两个函数的提及被传达给另两个函数的模块进行初始化,那么它就被称作反弹函数。
在C中必须用两个函数指针来初始化反弹函数。
https://stackoverflow.com/questions/2298242/callback-functions-in-c
*** 深入细致写作这个回帖, 这是网络上最合适的答疑
https://en.cppreference.com/w/cpp/named_req/Callable
几段可继续执行标识符(比如函数指针/出口处)像模块那般传予其它标识符,
那段标识符会在某一关键时刻被招唤继续执行,就叫作反弹。
如那段标识符立刻被执行就称并行反弹,
如等候之后某一关键时刻继续执行称触发器反弹。
迫切性:解耦。
常用的 API 并不透明化, 库函数象个服贸,也不能修正库函数,
就根本无法通过传至相同的“回叫函数“ 来达到满足用户相同市场需求的目地。
毁灭性优点:反弹冥界坑(Callback Hell)
https://en.cppreference.com/w/cpp/named_req/Callable
https://www.codenong.com/824234/
http://www.uml.org.cn/c%2B%2B/201908061.asp
C、C++和Pascal容许将函数指针做为HTA给其它函数。
其它词汇,如JavaScript,Python,Perl和PHP,容许单纯的将函数名做为HTA。
Objective-C中容许利用@selectorURL传达SEL类别的函数名。
在同时实现中,SEL类别被表述为函数名数组。
在C#与VB.NET的.NET Framework的词汇中,提供更多了一种运算子安全可靠的提及PCB,
简而言之的委派,用以表述包涵类别的函数指针,能用作同时实现反弹。
.NET中加进的该事件与阿提斯鲁夫尔谷函数提供更多了用作反弹的通用型句法。
函数式编程词汇一般来说支持第二级函数,能做为反弹传达给其它函数,
也能做为数据类别储存或者回到给其它函数。
这类词汇,比如说Algol 68,Perl,新版本的.NET词汇以及绝大多数函数式编程词汇中,
容许采用非官方的标识符块(lambda函数),借以替代在他处表述的分立的反弹函数。
在Apple或者LLVM的C词汇扩充中,包涵称作块的词汇优点,能做为函数的HTA,
做为反弹的一种同时实现。
在缺少函数类别的模块的面向对象的程序词汇中,比如Java,
反弹能用传达抽象类或接口来模拟。反弹的接收者会初始化抽象类或接口的方法,
这些方法由初始化者提供更多同时实现。这样的对象一般来说是一些反弹函数的集合,同时可能包涵它所需要的数据。
这种方法在同时实现这类设计模式时比较有用,比如
访问者模式,观察者模式与策略模式。
C++容许对象提供更多其自己的函数初始化操作的同时实现,即重载operator()。
标准模板库和函数指针一样接受这类对象(称作函数对象)
做为各种算法的模块。
https://zhuanlan.zhihu.com/p/349762321
麦文学:C 指针的小小实验20 赞同 · 5 评论文章
** 函数指针的练习
#include <stdio.h>
#include <stdlib.h>
//#include <unistd.h>
//#include <sys/reboot.h>
//#include <linux/reboot.h>
void add(double a, double b)
{
printf(“Addition result: %32.16lf\n”, a+b);
}
void subtract(double a, double b)
{
printf(“Subtraction result: %32.16lf\n”, a-b);
}
void multiply(double a, double b)
{
printf(“Multiplication result: %32.16lf\n”, a*b);
}
void division(double a, double b)
{
double divans;
if (b != 0){
divans = a/b;
printf(“Division result: %32.16lf\n”, divans);
}
else
{
printf(“DIV-by-0 error. Invalid input: %lf\n”, b);
}
}
int main()
{
// function_ptr_arr can be an array of function pointers
void (*function_ptr_arr[])(double, double) = {add, subtract, multiply, division};
double a = 0, b = 1;
int ch;
printf(“Enter: 0 to add, 1 subtract, 2 multiply, 3 divid\n”);
scanf(“%d”, &ch);
printf(“Enter two numbers:\n”);
scanf(“%lf”, &a);
scanf(“%lf”, &b);
if (b==0 && ch>=3)
{
printf (“Try another b value, please!\n”);
scanf(“%lf”, &b);
}
if (ch > 3) return 0;
(*function_ptr_arr[ch])(a, b);
return 0;
}
在C中只须传达两个函数指针,能像普通函数一样随时初始化它。
传达静态函数做为C++反弹很容易,它们与C函数非常相似。但是静态函数不容许访问类的非静态成员。这可能是两个有点麻烦的问题。
https://blog.stratifylabs.co/device/2019-08-05-Callbacks-in-Cpp/
C++中的反弹能有3种类别。
1. 函数指针
2. 函数对象/函数
3. Lambda函数
https://thispointer.com/designing-callbacks-in-c-part-1-function-pointers/