函数指针与回调函数
概述:在C/C++中,函数指针跟回调函数有着比较密切的关系,两者的结合使用给程序提供了更高的灵活性。
什么是函数指针
概念:顾名思义,函数指针也是一种指针,而指针的内容就是一个地址值,相较于一般的指针,函数指针的内容只不过是函数的地址罢了。
定义:
一般函数指针的定义,是基于函数类型的(一个函数类型由返回类型,形参列表决定),如下是一般函数指针定义示例:
void (*func_ptr)(int a,char b);
什么是回调函数
概念:通俗的讲,回调函数是满足某种触发条件后会被系统或者其他函数调用的函数,同时回调函数可以通过函数指针,传入另外一个函数,这样,可以动态的给另一个函数提供执行时的不同逻辑处理。详见后面的使用示例。当函数执行到一个回调函数时,修改PC(程序计数器)内容进而实现了执行指令的跳转;
函数指针实现函数回调的示例
#include <iostream>
// 定义函数指针类型
typedef int (*func_ptr)(int, int);
// 或者使用C++的类型别名
// using func_ptr = int (*)(int, int);
// 一个使用回调函数的其他函数
void doSomething(int a, int b, int flag, func_ptr callback) {
switch(flag) {
case 0:
std::cout << "Case 0: " << callback(a, b) << std::endl;
break;
case 1:
std::cout << "Case 1: " << callback(a, b) << std::endl;
break;
default:
std::cout << "Default case: -1" << std::endl;
break;
}
}
int add(int a, int b) {
return a + b;
}
int sub(int a, int b) {
return a - b;
}
int main(int argc, char** argv) {
int a = 5;
int b = 3;
// 传入加法函数
int flag = 0;
doSomething(a, b, flag, add);
// 传入减法函数
flag = 1;
doSomething(a, b, flag, sub);
return 0;
}