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