浅探C语言的回调函数(Callback Function)

目录

前言

解析回调函数组成

1.没有参数传递的回调函数

2.有参数传递的回调函数

使用

结语


前言

C语言里面有回调函数的用法,只要将函数的指针传入,对应的函数即可运行。这里我也贴一下其它解释:

回调函数本质是 "函数指针的参数化",通过将行为抽象为函数指针参数,实现动态控制流程。这种机制是C语言实现事件驱动、异步操作和通用算法的基石,广泛应用于系统编程、库设计和嵌入式开发中。

典型使用场景:

  1. 事件处理(如GUI库中的按钮点击)

  2. 异步操作(如I/O操作完成后的通知)

  3. 算法通用化 (如排序函数qsort()中的自定义比较逻辑)

  4. 库函数设计(允许用户注入自定义行为)

本文我们研究研究这个回调函数。

解析回调函数组成

这里我提供两个比较通用的回调函数,一个是没有参数的回调,一个是有参数的回调。

cpp 复制代码
//无参数的回调函数
void callback(void *fun)
{
    ((void *(*)())(fun))();
}

//有参数的回调函数
void callback(void *fun, void *arg)
{
    ((void *(*)(void *))(fun))(arg);
}

我们主要研究函数里面的那两个表达式,这才是回调函数的精髓。

1.没有参数传递的回调函数

cpp 复制代码
((void *(*)())(fun))();

这里其实有一个强制转换的过程

cpp 复制代码
(void *(*)())

没错,括号里面其实是一个强制转换,转换为返回值为void *类型,(*)表明这里对应位置是一个指针,()表示没有参数。

然后在函数中对应

cpp 复制代码
(fun)();

最后就是对参数的处理,对转换完成的函数指针,表明没有参数。

cpp 复制代码
((void *(*)())(fun))---->();

2.有参数传递的回调函数

cpp 复制代码
((void *(*)(void *))(fun))(arg);

同理,这里也有一个强制转换的过程

cpp 复制代码
(void *(*)(void *))

强制转换为返回值为void *,(*)对应位置还是函数的指针,(void *)代表接收的参数是void *类型。

然后就是将转换之后的fun说明是那个参数arg

cpp 复制代码
(fun)(arg)

先转换,转换之后再赋上参数的值。

cpp 复制代码
((void *(*)(void *))(fun))(arg);

使用

这里我贴的虽然是C++的代码,其实只是函数重载比较方便,改个函数名,一样能使用!

cpp 复制代码
#include <iostream>
#include <unistd.h>
void callback(void *fun);
void callback(void *fun, void *arg);

void *task(void *arg)
{
    long int num = (long int)arg;
    while (1)
    {
        std::cout << "Hello!World!"<<"-->"<<num << std::endl;
        sleep(1);
        num++;
    }
}

int main(int argc, char const *argv[])
{
    long int i = 0;
    callback((void *)task,(void *)i);

    return 0;
}

void callback(void *fun)
{
    ((void *(*)())(fun))();
}

void callback(void *fun, void *arg)
{
    ((void *(*)(void *))(fun))(arg);
}

结语

在C语言中,回调函数(Callback Function) 是一个通过函数指针调用的函数。其核心思想是将一个函数的地址作为参数传递给另一个函数(通常称为"调用函数"或"高阶函数"),当特定事件或条件发生时,调用函数会通过这个指针调用回调函数。

核心概念:

  1. 函数指针传递:回调函数的地址被作为参数传递给另一个函数。

  2. 异步执行:回调函数不会立即执行,而是在特定条件(如事件触发、任务完成)时被调用。

  3. 解耦与扩展性:调用函数无需知道回调函数的具体实现,只需定义接口,使代码更灵活。

相关推荐
Felven1 小时前
A. Helmets in Night Light
c语言
anyup1 小时前
2026第一站:分享我在高德大赛现场学到的技术、产品与心得
前端·架构·harmonyos
BBBBBAAAAAi1 小时前
Claude Code安装记录
开发语言·前端·javascript
xiaolyuh1232 小时前
【XXL-JOB】 GLUE模式 底层实现原理
java·开发语言·前端·python·xxl-job
源码获取_wx:Fegn08952 小时前
基于 vue智慧养老院系统
开发语言·前端·javascript·vue.js·spring boot·后端·课程设计
毕设十刻2 小时前
基于Vue的人事管理系统67zzz(程序 + 源码 + 数据库 + 调试部署 + 开发环境配置),配套论文文档字数达万字以上,文末可获取,系统界面展示置于文末
前端·数据库·vue.js
anyup2 小时前
从赛场到产品:分享我在高德大赛现场学到的技术、产品与心得
前端·harmonyos·产品
前端工作日常2 小时前
我学习到的A2UI的功能:纯粹的UI生成
前端
Jing_Rainbow2 小时前
【 前端三剑客-37 /Lesson61(2025-12-09)】JavaScript 内存机制与执行原理详解🧠
前端·javascript·程序员
Illusionna.2 小时前
C语言自动进行独立样本 t 检验
c语言·自动化·显著性·统计检验·独立样本t检验·ttest·levene