回调函数示例讲解

简介: 回调函数示例讲解

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

相关文章
|
JavaScript 前端开发
如何向回调函数中传入其他参数
如何向回调函数中传参数   最近写JS经常会因为向回调函数中传参而头疼,今天总结一下向回调函数中传参的方法,以后的应用中就不用在到处去找了。   首先构建一个需要向回调函数中传入参数的典型应用。
1283 0
|
9月前
|
人工智能 机器人 中间件
【C++】C++回调函数基本用法(详细讲解)
【C++】C++回调函数基本用法(详细讲解)
|
9月前
|
存储 关系型数据库 MySQL
错误处理程序示例
错误处理程序示例。
61 1
|
C# C++
c#调用c++带有回调函数方法的实现
在c++中有个回调函数指针的概念,只需要某个函数在调用定时器函数时传入一个函数指针就能达到目的,但C#中没有函数指针的概念,我们该怎样来实现呢。 其实说到回调函数,大家应该能想到c#中的委托,虽然名字不一样,但在各自的语言范畴都能实现相似的功能。
1571 0
|
C++
理解C++中函数的返回
  连续几年的C++程序设计课教学中,学生中总有人要求为他们单独解释函数的返回(return)究竟是什么意思。各种书中都会详讲返回值的问题,而学生们掌握的难点却是在返回至何处执行。本文试图通过对一般函数及递归函数   从程序执行的流程角度,返回即是“被调用函数执行结束后,返回至调用这个函数的位置,接着完成其他任务。”。这句话绕一些,看一些具体的例子。 //例1 #include &lt;i
1042 0
|
9月前
|
定位技术 C++ Python
C++一个函数返回两个或更多个返回值的方法
C++一个函数返回两个或更多个返回值的方法
238 1
|
9月前
|
存储 搜索推荐 Python
函数的调用和返回值
函数的调用和返回值
|
存储 安全
有时我们需要调用一个函数时,返回多个不同类型的数据
有时我们需要调用一个函数时,返回多个不同类型的数据   使用Object[]存储:   public class Print { public static void main(String[] args) { Object[] array = retur...

热门文章

最新文章