在项目中经常会看到一些callback函数,callback函数实现了用户自定义处理

主要表现在C语言的面向对象编程、异步处理

C语言中的callback函数的实现,主要是利用了函数指针

废话不多说,直接贴代码

#include<stdio.h>
#include<string.h>typedef struct{int calc_max;int calc_sum;int (*calc_get_max)(int x, int y);int (*calc_get_sum)(int x, int y);
}calculate_t;typedef void (*callback_function)(int index, int* array, int* out);static int get_max(int a, int b){return a > b? a:b;}static int get_sum(int a, int b){return a + b;}static void my_get_array_elem(int index, int* array, int *out){*out = array[index];}int calculate_test(calculate_t* calc, int a, int b){int sum = a + b;int max = a > b ? a : b;printf("right: sum = %d, max = %d\n", sum, max);calc->calc_sum = calc->calc_get_sum(a, b);calc->calc_max = calc->calc_get_max(a, b);if ((sum == calc->calc_sum) && (max == calc->calc_max)){return 1;}return 0;}int array_iterator(int index, int* array, callback_function get_array_elem)
{int elem = 0;get_array_elem(index, array, &elem);return elem;
}int main(int argc, char** argv)
{int a = 10;int b = 9;int index = 0;calculate_t calc = {0};int array[] = {78, 56, 54, 41, 62, 25, 10};memset(&calc, 0, sizeof(calc));calc.calc_get_max = get_max;calc.calc_get_sum = get_sum;if (1 == calculate_test(&calc, a, b)){printf("calc: sum = %d, max = %d\n", calc.calc_sum, calc.calc_max);}else{printf("calc error\n");}for (index = 0; index < sizeof(array)/sizeof(int); index++){printf("right: array[%d] = %d ", index, array[index]);printf("my: array[%d] = %d\n", index, array_iterator(index, array, my_get_array_elem));    }return 0;
}

上面的代码并没有给出callback函数在异步处理上的表现,Unix中信号处理机制、和一些第3方的开源库实现的事件驱动机制都可以认为是异步处理,都是注册某个信号处理和事件处理函数

callback函数详解相关推荐

  1. 函数指针与回调函数详解

    函数指针与回调函数详解 1.什么是函数指针? 函数(的)指针就是指针.这个指针存放一个函数的地址,而函数的名称就该函数的入口,即地址.这类似于数组名就是数组的首地址.我们可以通过反汇编直观的查看到函数 ...

  2. php output详解,PHP输出缓冲控制Output Control系列函数详解,output函数详解

    PHP输出缓冲控制Output Control系列函数详解,output函数详解 概述 以前研究过PHP的输入输出缓冲,不过博客搬家以后,原来文章找不到了,今天看到一篇好文,顺便转载过来. 简介 说到 ...

  3. Java 回调函数详解及使用

    Java 回调函数详解 前言: C语言中回调函数解释: 回调函数(Callback Function)是怎样一种函数呢? 函数是用来被调用的,我们调用函数的方法有两种: 直接调用:在函数A的函数体里通 ...

  4. C语言网络编程:accept函数详解

    文章目录 前言 函数描述 代码实例 如何得到客户端的IP 和 端口号 前言 当使用tcp服务器使用socket创建通信文件描述符,bind绑定了文件描述符,服务器ip和端口号,listen将服务器端的 ...

  5. 【FFmpeg】函数详解(三)

    FFmpeg函数详解 14.av_write_frame 15.av_interleaved_write_frame 16.av_write_trailer 17.avio_close 18.av_i ...

  6. 【FFmpeg】函数详解(二)

    FFmpeg函数详解 9.av_dump_format 10.avio_open 11.avformat_write_header 12.avcodec_send_frame 13.avcodec_r ...

  7. 【FFmpeg】函数详解(一)

    FFmpeg函数详解 一.错误码相关 1.AVERROR 2.av_strerror 3.其他错误码解释 二.编解码 1.获取编解码器 2.申请.释放上下文环境 3.打开编码器avcodec_open ...

  8. 【ES6】Generator函数详解

    [ES6]Generator函数详解 一.Generator函数简介 基本概念 函数写法 yield关键字介绍 二.next方法的参数 三.for...of循环 四.关于普通throw()与Gener ...

  9. mysql的聚合函数综合案例_MySQL常用聚合函数详解

    一.AVG AVG(col) 返回指定列的平均值 二.COUNT COUNT(col) 返回指定列中非NULL值的个数 三.MIN/MAX MIN(col):返回指定列的最小值 MAX(col):返回 ...

最新文章

  1. Python的代码结构
  2. matlab ac电源,MATLAB对AC/DC/AC电源的死区效应谐波仿真
  3. for循环延时_RocketMQ进阶-延时消息
  4. Consul etcd ZooKeeper euerka 对比
  5. python 动态规划_DP动态规划(Python实现)
  6. 学校云计算机室,云计算实训室简介
  7. html表白树代码程序怎么调,抖音表白弹窗vbs代码怎么制作 表白树特效程序代码教程详细介绍...
  8. [Unity] UniWebView的使用
  9. 51单片机的汇编语言
  10. 今天做了一下chinaitlab上面的CCNA试题!
  11. dbf是什么文件格式
  12. 说说vector的emplace_back和push_back
  13. 三步快速远程桌面控制,开启远程办公
  14. Acwing算法—动态规划
  15. 高并发访问数据库问题
  16. npm--踩坑--npm audit fix 解决方法
  17. GluonCV跑代码经常碰到的问题
  18. 更改ip地址的软件多少钱一个月_武汉社保代缴多少钱一个月?武汉社保一个月交多少钱?...
  19. 离线识别率最高的Python人脸识别系统
  20. Flink 状态管理与 Checkpoint 机制

热门文章

  1. 【网络】HTTP中的GET方法和POST方法
  2. Spring官方文档之核心技术Core Technologies
  3. 《Java从小白到大牛》纸质版已经上市了!!
  4. 使用sendmail命令发送附件
  5. 路由器做交换机用实现双路由的连接
  6. 嵌入式linux qt 开源,嵌入式Linux应用程序开发-(1)第一个嵌入式QT应用程序
  7. 嵌入式 linux 屏 翻转,linux嵌入式qt的屏幕旋转与字体大小问题
  8. Oracle 创建序列及查询序列是否存在
  9. mybatis基础动态SQLlog4j简单使用
  10. Hotspot Metaspace