理解回调函数,回调函数的使用
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
一、普通函数和回调函数
普通的函数一般包括函数名和函数实现这两部分,并且这两部分是固定好的,也就是说我们调用这个函数实现的功能是明确的、是唯一的(只提供了一种功能)
然后在使用的时候,调用该函数名+(…)就可以使用这个功能,括号很重要、很重要、很重要。。。。。。
还有就是普通的函数不能作为参数一样被传递,只能通过函数名+(…)的形式被使用
回调函数还是一个函数,它也是有函数名和函数实现这两个部分组成,区别在回调函数是可以被当作参数一样被传递(可移动的),
当回调函数被当作参数传递时,相当于一个指向函数的一个指针(函数指针),回调函数的函数名就是一个函数指针,注意不能带括号
在需要用到回调函数的功能的时候,就可以通过函数名+()的形式去使用
这么一对比,好像回调函数除了能作为参数一样被传递,和普通函数也没啥区别,但是使用起来很灵活
C++中的多态是通过虚函数和继承来实现的,但是在C语言中没有多态的概念,就是通过回调函数实现类似多态的功能
1、主函数需要调用回调函数
2、中间函数登记回调函数
3、触发回调函数事件
4、调用回调函数
5、响应回调事件
回调函数的简单案例
#include <iostream> #include <vector> #include <algorithm> #include<stack> #include<math.h> #include<string> #include<string.h> using namespace std; //定义一个函数指针,这个函数指针的类型名叫callback,它指向的函数返回值为void,调用的参数为void typedef void(*callback)(void); //定义命令结构体 typedef struct cmd { string name; //命令的名字 callback func; //与命令相对应的函数指针 cmd(string A, callback B) { name = A, func = B; } }cmd_t; //响应回调函数,实现回调函数的功能 void hello() { printf("hello\n"); } void hi() { printf("hi\n"); } void exit() { exit(0); } //中间函数登记回调函数 void cmd_hello() { hello(); } void cmd_hi() { hi(); } void cmd_exit() { exit(); } //回调函数登记表 const cmd_t cmd_table[] = { {"hello",cmd_hello}, {"hi",cmd_hi}, {"exit",cmd_exit} }; //查找命令 cmd_t* my_find(string val) { for (int i = 0; i < sizeof(cmd_table)/sizeof(cmd_t); i++) { if (val==cmd_table[i].name) { cmd_t* temp = new cmd_t(cmd_table[i].name, cmd_table[i].func); return temp; } } return NULL; } int main() { string val; cmd_t *cmd_ptr; while (1) { cin>>val; cmd_ptr = my_find(val); //触发回调事件 if (cmd_ptr) { //调用回调函数 cmd_ptr->func(); } else { printf("ERROR ,NO THIS CMD\n"); } } return 0; }