回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

 

 

一、普通函数和回调函数

 

普通的函数一般包括函数名和函数实现这两部分,并且这两部分是固定好的,也就是说我们调用这个函数实现的功能是明确的、是唯一的(只提供了一种功能)

 

然后在使用的时候,调用该函数名+(…)就可以使用这个功能,括号很重要、很重要、很重要。。。。。。

 

还有就是普通的函数不能作为参数一样被传递,只能通过函数名+(…)的形式被使用

 

 

 

回调函数还是一个函数,它也是有函数名和函数实现这两个部分组成,区别在回调函数是可以被当作参数一样被传递(可移动的),

 

当回调函数被当作参数传递时,相当于一个指向函数的一个指针(函数指针),回调函数的函数名就是一个函数指针,注意不能带括号

 

在需要用到回调函数的功能的时候,就可以通过函数名+()的形式去使用

 

 

这么一对比,好像回调函数除了能作为参数一样被传递,和普通函数也没啥区别,但是使用起来很灵活

 

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;
}

 

 

版权声明:本文为-citywall123原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/-citywall123/p/13426154.html