理解回調函數,回調函數的使用


回調函數就是一個通過函數指針調用的函數。如果你把函數的指針(地址)作為參數傳遞給另一個函數,當這個指針被用來調用其所指向的函數時,我們就說這是回調函數。回調函數不是由該函數的實現方直接調用,而是在特定的事件或條件發生時由另外的一方調用的,用於對該事件或條件進行響應。

 

 

一、普通函數和回調函數

 

普通的函數一般包括函數名和函數實現這兩部分,並且這兩部分是固定好的,也就是說我們調用這個函數實現的功能是明確的、是唯一的(只提供了一種功能)

 

然后在使用的時候,調用該函數名+(...)就可以使用這個功能,括號很重要、很重要、很重要。。。。。。

 

還有就是普通的函數不能作為參數一樣被傳遞,只能通過函數名+(...)的形式被使用

 

 

 

回調函數還是一個函數,它也是有函數名和函數實現這兩個部分組成,區別在回調函數是可以被當作參數一樣被傳遞(可移動的),

 

當回調函數被當作參數傳遞時,相當於一個指向函數的一個指針(函數指針),回調函數的函數名就是一個函數指針,注意不能帶括號

 

在需要用到回調函數的功能的時候,就可以通過函數名+()的形式去使用

 

 

這么一對比,好像回調函數除了能作為參數一樣被傳遞,和普通函數也沒啥區別,但是使用起來很靈活

 

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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM