回调函数示例讲解

简介: 回调函数示例讲解

1. 什么是回调函数

关于回调函数的定义,可以自行Wikipedia,但是我觉得官方的都太晦涩,看了还是弄不懂。这里给出在一个帖子上看到的定义,本人觉得比较好理解。

函数 F1 调用函数 F2 的时候,函数 F1 通过参数给 函数 F2 传递了另外一个函数 F3 的指针,在函数 F2 执行的过程中,函数F2 调用了函数 F3,这个动作就叫做回调(Callback),而先被当做指针传入、后面又被回调的函数 F3 就是回调函数。

回调函数最大的好处就是降低耦合度。

2. 具体示例

2.1 简单的回调函数【函数指针传参】

test.c

#include<stdio.h>
int Callback_1(int x) // Callback Function 1
{
    printf("Hello, this is Callback_1: x = %d ", x);
    return 0;
}
int Callback_2(int x) // Callback Function 2
{
    printf("Hello, this is Callback_2: x = %d ", x);
    return 0;
}
int Callback_3(int x) // Callback Function 3
{
    printf("Hello, this is Callback_3: x = %d ", x);
    return 0;
}
int Handle(int y, int (*Callback)(int))
{
    printf("Entering Handle Function. ");
    Callback(y);
    printf("Leaving Handle Function. ");
}
int main()
{
    int a = 2;
    int b = 4;
    int c = 6;
    printf("Entering Main Function. ");
    Handle(a, Callback_1);
    Handle(b, Callback_2);
    Handle(c, Callback_3);
    printf("Leaving Main Function. ");
    return 0;
}

编译输出:

2.2 先注册回调函数,再调用

实际工程中一般会采用这种方式去调用

main.cpp

#include <iostream>
#include "b.h"
#include "common.h"
int Func(int a, float b)
{
   DEBUG("Func start\n");
   printf("a = %d, b = %f\n", a, b);
   DEBUG("Func end\n");
   return a++;
}
int main(void)
{
   B *b_ = new B;
   DEBUG("main start\n");
   b_->Registcallback(Func);
   DEBUG("Registcallback quit\n");
   b_->test(1,3);
   b_->test2(3,5);
   
   return 0;
}

b.h

#ifndef B_H__
#define B_H__
#include "common.h"
class B
{
public:
    bool Registcallback(Function_call cb);
    int test(int a, float b);
    int test2(int a, float b);
    Function_call cfg_callbck_;
};
#endif

b.cpp

#include"b.h"
int B::test(int a, float b)
{
    DEBUG("test start\n");
    cfg_callbck_(a, b);
    DEBUG("test end\n");
 
}
int B::test2(int a, float b)
{
    DEBUG("test2 start\n");
    cfg_callbck_(a, b);
    DEBUG("test2 end\n");
 
}
bool B::Registcallback(Function_call callback)
{
    DEBUG("Registcallback start\n");
  if (callback != nullptr) 
    {
    cfg_callbck_ = callback;
        DEBUG("cfg_callbck_registered.\n");
    return true;
  }   
    DEBUG("Registcallback end\n");
    return false;
}

common.h

#ifndef COMMON_H__
#define COMMON_H__
#include "stdio.h"
typedef int (*Function_call)(int a, float b);
// typedef int (*Function_call_new)(int a, float b);
#define DEBUG(format,...) printf(" [File:%s, Line:%d]" format, __FILE__, __LINE__, ##__VA_ARGS__)
#endif

Makefile

CXX = g++
INC = -I ./
CXXFLAGS = -DSNACC_DEEP_COPY -DHAVE_VARIABLE_SIZED_AUTOMATIC_ARRAYS -Wno-deprecated  -fPIC
 
TARGET = main
 
SRC=$(wildcard ./*.cpp)
 
OBJ=$(patsubst %.cpp, %.o, $(SRC))
 
$(TARGET): $(OBJ)
  $(CXX) $(CXXFLAGS) -o $@ $^ $(LIB) 
 
$(OBJ):%.o: %.cpp
  $(CXX) $(CXXFLAGS)  $(INC) -o $@ -c $<
 
clean:
  rm -f *.o
  rm -f $(TARGET)

编译输出:

简单分析回调函数调用过程:

通过Registcallback函数对回调函数进行注册,注册之后,就将回调函数作为指针传给了cfg_callbck_,之后每次用到cfg_callbck_指针,就会调用一次回调函数。

整个项目已经打包上传到至https://download.csdn.net/download/weixin_42445727/34879262

相关文章
|
1月前
|
JavaScript 前端开发
计算属性和 watch 监听函数的回调函数可以异步执行吗?
【10月更文挑战第23天】总的来说,虽然计算属性和监听函数的回调函数通常是同步执行的,但在特定情况下可以进行异步操作。在实际应用中,要根据具体的需求和场景来合理选择是否使用异步执行,并注意处理好异步操作的结果和状态,以确保应用的正常运行和性能优化。
|
4月前
|
前端开发 Java Maven
多种方式实现 Future 回调返回结果
多种方式实现 Future 回调返回结果
39 0
|
7月前
|
存储 搜索推荐 Python
函数的调用和返回值
函数的调用和返回值
|
7月前
|
存储 JavaScript 前端开发
js开发:请解释什么是回调函数(callback function),并给出一个示例。
回调函数是JavaScript中处理异步编程的一种常见模式,常用于事件驱动和I/O操作。它们作为参数传递给其他函数,在特定条件满足或任务完成后被调用。例如,`asyncOperation`函数接受回调函数`handleResult`,在模拟的异步操作完成后,调用`handleResult`并传递结果。这使得程序员能在操作完成后执行后续任务。
80 1
|
7月前
|
人工智能 机器人 中间件
【C++】C++回调函数基本用法(详细讲解)
【C++】C++回调函数基本用法(详细讲解)
|
7月前
|
定位技术 C++ Python
C++一个函数返回两个或更多个返回值的方法
C++一个函数返回两个或更多个返回值的方法
187 1
|
7月前
|
存储 关系型数据库 MySQL
错误处理程序示例
错误处理程序示例。
53 1
|
7月前
|
中间件 Linux API
回调函数和注册回调函数你还不理解吗.......
回调函数和注册回调函数你还不理解吗.......
【学习笔记之我要C】函数的参数与调用
【学习笔记之我要C】函数的参数与调用
156 0