C及C++的回调函数概念及应用

本文介绍了C/C++中的回调函数,详细阐述了回调函数的概念,函数指针的使用,以及在C++中如何处理成员函数作为回调。回调函数可以是普通函数或成员函数,可以通过函数指针、std::function和std::bind来实现。文中给出了各种场景下的回调函数应用,讨论了何时使用回调函数及其优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.C语言中回调函数的概念

1.1回调函数

在计算机程序设计中,回调函数,或简称回调(Callback 即call then back 被主函数调用运算后会返回主函数),是指通过参数将函数传递到其它代码的,某一块可执行代码的引用。这一设计允许了底层代码调用在高层定义的子程序。以sort()排序函数为例。
回调函数
要实现回调函数,最关键的一点是要将函数的指针传递给一个函数(上图中是库函数),然后这个函数就可以通过这个指针来调用回调函数了。

1.2 函数指针

函数指针也是一种指针,它指向的是函数。在C中,每个函数在编译后都是存储在内存中,并且每个函数都要一个入口地址,根据这个地址,我们就可以访问并使用这个函数。函数指针就是通过指向这个函数的入口,从而调用这个函数。

1.2.1 函数指针的使用

  • 函数指针的定义
//method 1
void (*p_func)(int , int ,float) = NULL;
//method 2
typedef void(*tp_func)(int,int,float);
tp_func p_func = NULL;

这两种方式都是定义了一个指向返回值为void类型,参数为(int,int,float)的函数指针。

  • 函数指针的赋值
void (*p_func)(int,int,float) = NULL;
p_func=&func1;
p_func=func2;  //编译器会隐式地将func_2由void()(int,int,float)类型转换成
               //void(*)(int,int,float)

详见StackOverflow

  • 使用函数指针调用函数
    因为函数指针也是指针,因此可以使用常规的带*的方法来调用函数,和函数指针的赋值一样,我们也可以使用两种方法:
int val1 = p_func(1,2,3.0);
int val1 = (*p_func)(1,2,3.0);
  • 将函数指针作为参数传给函数
    函数指针和普通指针一样,我们可以将它作为函数的参数传递给函数,下面我们看看如何实现:
//func_3 将函数指针p_func 作为其形参
void func_3(int a,int b,float c,void(*p_func)(int ,int,float ))
{
   
   
	(*p_func)(a,b,c);
}
//func_4 调用func_3
void func_4()
{
   
   
	func_3(1,2,3.0,func_1);
	//or func_3(1,2,3.0,&func_1);
}
  • 函数指针作为函数返回类型
    返回类型为函数指针的函数:
void (* func_5(int,int,float))(int,int)
{
   
   
	...
}

func_5 以(int,int,float)为参数,其返回类型为void(*)(int,int)。

  • 函数指针数组
void (*func_array_1[5])(int,int,float);

typedef void (*P_func_array)(int,int,float);
P_func_array func_array[5];

2.函数指针及回调函数示例

#include <stdio.h>
#i
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值