浅谈C/C++回调函数(Callback)& 函数指针
2018-03-05 11:43
232 查看
摘要:回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
按照上面的说法,实现一个C Language的回调函数如下,[cpp] view plain copy#include <stdio.h>
//回调函数
int ADD(int (*callback)(int,int), int a, int b){
return (*callback)(a,b);//此处回调add函数...
}
//普通函数
int add(int a, int b){
return a + b;
}
int main(void){
printf("%d\n",add(1,2));
printf("%d\n",ADD(add,1,2));
return 0;
}
从上面的定义及其实现可以看出,回调函数必须有函数指针的存在,而这里函数指针一般可以先typedef一下,然后再使用,一般格式: 返回值 (*指针名) (参数列表)[cpp] view plain copy#include <stdio.h>
//返回值(*指针名)(参数列表)
typedef int (*callback)(int,int);
//回调函数
int ADD(callback p, int a, int b){
return (*p)(a,b);//此处回调add函数...
}
//普通函数
int add(int a, int b){
return a + b;
}
int main(void){
printf("%d\n",add(1,2));
printf("%d\n",ADD(add,1,2));
return 0;
}
可是,根据上面的例子,回调函数搞得这么麻烦,貌似并没有什么大作用.....纠结!别纠结,来看一下库函数中的sort排序是怎么弄的。algorithm它提供了某些排序算法的实现(如冒泡排序、快速排序、shell排序、shake排序等等),为了能让库更加通用,不想在函数中嵌入排序逻辑,而让使用者来实现相应的逻辑;或者,能让库可用于多种数据类型(int、float、string),此时,该怎么办呢?可以使用函数指针,并进行回调,如下:[cpp] view plain copy#include <stdio.h>
#include <algorithm>
bool cmp(int a, int b){
return a > b;
}
int main(void){
int a[8] = {5,43,1,7,8,13,0,74};
std::sort(a,a+10,cmp);//callback
return 0;
}
这里只是提及了一下库函数中的排序问题,如果想了解更多,可以去看一下《泛型编程与C++标准模板库 : 浅谈sort()排序函数》这篇文章。
转载:http://blog.csdn.net/eric_e/article/details/79443926
按照上面的说法,实现一个C Language的回调函数如下,[cpp] view plain copy#include <stdio.h>
//回调函数
int ADD(int (*callback)(int,int), int a, int b){
return (*callback)(a,b);//此处回调add函数...
}
//普通函数
int add(int a, int b){
return a + b;
}
int main(void){
printf("%d\n",add(1,2));
printf("%d\n",ADD(add,1,2));
return 0;
}
从上面的定义及其实现可以看出,回调函数必须有函数指针的存在,而这里函数指针一般可以先typedef一下,然后再使用,一般格式: 返回值 (*指针名) (参数列表)[cpp] view plain copy#include <stdio.h>
//返回值(*指针名)(参数列表)
typedef int (*callback)(int,int);
//回调函数
int ADD(callback p, int a, int b){
return (*p)(a,b);//此处回调add函数...
}
//普通函数
int add(int a, int b){
return a + b;
}
int main(void){
printf("%d\n",add(1,2));
printf("%d\n",ADD(add,1,2));
return 0;
}
可是,根据上面的例子,回调函数搞得这么麻烦,貌似并没有什么大作用.....纠结!别纠结,来看一下库函数中的sort排序是怎么弄的。algorithm它提供了某些排序算法的实现(如冒泡排序、快速排序、shell排序、shake排序等等),为了能让库更加通用,不想在函数中嵌入排序逻辑,而让使用者来实现相应的逻辑;或者,能让库可用于多种数据类型(int、float、string),此时,该怎么办呢?可以使用函数指针,并进行回调,如下:[cpp] view plain copy#include <stdio.h>
#include <algorithm>
bool cmp(int a, int b){
return a > b;
}
int main(void){
int a[8] = {5,43,1,7,8,13,0,74};
std::sort(a,a+10,cmp);//callback
return 0;
}
这里只是提及了一下库函数中的排序问题,如果想了解更多,可以去看一下《泛型编程与C++标准模板库 : 浅谈sort()排序函数》这篇文章。
转载:http://blog.csdn.net/eric_e/article/details/79443926
相关文章推荐
- 浅谈C/C++回调函数(Callback)& 函数指针
- C++使用模板、函数指针、接口和lambda表达式这四种方法做回调函数的区别比较
- C/C++ 不带参数的回调函数 与 带参数的回调函数 函数指针数组 例子
- c/c++比较灵活的方法:回调函数和函数指针
- 【转载】C++成员函数指针的应用,可作为回调函数实参
- C++ 回调函数与函数指针
- C++函数的传值调用&指针调用&引用调用
- [转]浅谈C++指针直接调用类成员函数
- C/C++之回调函数---函数指针的作用
- 结构体中指向函数的指针(C) && 结构体中的函数(C++)
- C/C++高阶语法:函数指针及其应用,回调函数
- c++中回调函数和函数指针的使用
- C++语言笔试题目写一个函数计算当参数为n(n很大)时的值 1-2+3-4+5-6+7......+n&字符指针、浮点数指针、以及函数指针占用的内存等
- c 函数指针的定义 和 C++回调函数的使用
- 【C++基础之八】函数指针和回调函数
- C++函数的传值调用&指针调用&引用调用
- 浅谈c++之指针型函数与函数指针
- C/C++之回调函数---函数指针的作用
- C/C++之回调函数---函数指针的作用
- c++:函数传指针(void * xx)、传引用(void & xx)和传指针的引用(void *& xx)