C 回调函数是什么?
在 C 语言中,回调函数指的是通过 “函数指针” 的方式,来将一个 “函数” 作为参数传递给另一个函数,然后再调用函数时执行传入的函数。
示例:回调函数的基本用法
#include <stdio.h>
typedef void (*callback_t)(void *arg);
// 定义 fn1
void fn1(callback_t callback, void *arg)
{
printf("执行 fn1\n");
// 执行回调函数 fn2
callback(arg);
}
// 定义 fn2
void fn2(void *arg)
{
printf("执行 fn2:%s\n", (char *)arg);
}
int main(void)
{
// 执行 fn1
fn1(fn2, "绿叶网");
return 0;
}运行结果如下。
执行 fn1
执行 fn2:绿叶网分析:
在这个例子中,我们定义了 2 个函数 fn1() 和 fn2(),并且展示了如何使用 C 语言中的回调函数。
typedef void (*callback_t)(void *arg);上面这句代码表示使用 typedef 关键字定义了一个 callback_t 的类型别名。该类型别名指向一个函数,该函数的返回值类型为 void,该函数的参数类型为 void*。
void fn1(callback_t callback, void *arg)
{
printf("执行 fn1\n");
// 执行回调函数 fn2
callback(arg);
}上面这段代码用于定义一个名为 fn1 的函数,该函数接收以下 2 个参数。
callback:类型为 callback_t,指向一个回调函数。arg:类型为 void*,可以指向任何类型的数据。
在 fn1() 函数的内部,我们执行了回调函数 fn2()。也就是说,只要 fn1() 函数被调用了,它内部代码就会被执行,然后就会执行回调函数 callback(arg);。
注意: 回调函数的参数类型和返回值类型,必须与调用函数的定义一致。
C 回调函数的应用场景
在 C 语言中,回调函数主要用于以下 4 种场景。
- 异步编程:比如在网络编程中,当数据接收完成时,可以通过回调函数来处理接收到的数据。
- 事件处理:比如在操作系统中,可以使用回调函数处理中断、信号等事件。
- 线程池:比如在线程池中,可以使用回调函数指定线程要执行的任务。
- GUI 编程:比如在 GUI 编程中,可以使用回调函数来处理鼠标单击、鼠标移动、键盘输入等事件。
C 回调函数的优缺点
在 C 语言中,回调函数有以下的优点。
- 回调函数可以使代码更加模块化,并更具可维护性。
- 回调函数可以使代码更加灵活,并更具可扩展性。
同时,回调函数也有以下缺点。
- 回调函数可能导致代码难以理解和调试,降低代码可读性。
- 回调函数可能导致内存泄漏,有一定安全性问题。
