0.结构体版C99回调,demo.c
#include <stdio.h>
struct snd_soc_codec_driver {int (*write)(unsigned int, unsigned int);//等价于无参的,这样相当于变长参数,自己可以随意写参数:int (*write)();
};int callback_write(unsigned int reg, unsigned int val){printf("%s(), %d, reg: %d, val: %d\n",__FUNCTION__,__LINE__,reg,val);return 0;
}int main(){struct snd_soc_codec_driver test_codec = {.write = callback_write,};    if(test_codec.write != NULL)test_codec.write(1,2);
}1、first_callback.c
#include <stdio.h>
//声明event_cb结构体
struct event_cb;/*定义函数指针:函数指针本质上是一个指针,指向一个函数的指针.相当于指针变量如:int *p; p是指向一个int类型的指针.而callback是一个指向一个函数的指针而已,callback指向函数的参数可以直接传进去调用*/
int(*callback)(struct event_cb *evt, int x, int y);
//int(*callback)();//无参也可以//定义event_cb结构体成员变量
struct event_cb{void *data;int sum;
}saved;//已经实现的函数,经过计算把结果返回给函数指针(*callback)()
int calc_data(struct event_cb *evt, int x, int y){char *data= "Hello World!";evt->sum = x + y;evt->data = data;printf("Add : %d\n",evt->sum);return 0;
}int main(void){int x = 3,y = 5;//将calc_data的函数入口地址赋值给callbackcallback = calc_data;//calc_data实现函数地址传过来后,函数指针callback可以直接传参调用callback(&saved,1,2);printf("total = %d, data = %s\n",saved.sum,saved.data);return 0;
}/*****************************************************************************/2、second_callback.c
#include <stdio.h>
//声明event_cb结构体
struct event_cb;/*typedef定义后:callback等价于int(*)()类型callback pf等价于int (*pf)(void)声明,pf是一个函数指针变量*/
typedef int(*callback)(struct event_cb *evt, int x, int y);//定义event_cb结构体成员变量
struct event_cb{callback call_back;void *data;int sum;
}saved;/*回调函数的目的:
1.定义一个函数指针(*callback)()
2.把已实现函数(get_data)地址传给函数指针(*callback)()
3.调用函数指针(*callback)(其实调用的是已经实现的函数get_data())并传递给其参数,让已经实现的函数计算结果返回给我们定义的函数指针,就可以把别人的代码复用起来.
注意:(*callback)()和get_data()参数和返回值必须相同*///注册回调
void set_register(callback cb){saved.call_back = cb;printf("%s(), line = %d\n", __FUNCTION__,__LINE__);
}//已经实现的函数,经过计算把结果返回给函数指针(*callback)()
int get_data(struct event_cb *evt, int x, int y){char *data= "Hello World!";evt->sum = x + y;evt->data = data;printf("Add : %d\n",evt->sum);return 0;
}int main(void){int x = 3,y = 5;set_register(get_data);//saved.call_back = get_data;saved.call_back(&saved, x, y);printf("%s(), total = %d, data = %s\n", __FUNCTION__,saved.sum,saved.data);return 0;
}

C语言之最简单回调demo(五)相关推荐

  1. 《Go语言圣经》学习笔记 第五章函数

    <Go语言圣经>学习笔记 第五章 函数 目录 函数声明 递归 多返回值 匿名函数 可变参数 Deferred函数 Panic异常 Recover捕获异常 注:学习<Go语言圣经> ...

  2. Dubbo入门介绍---搭建一个最简单的Demo框架

    Dubbo入门---搭建一个最简单的Demo框架 置顶 2017年04月17日 19:10:44 是Guava不是瓜娃 阅读数:320947 标签: dubbo zookeeper 更多 个人分类: ...

  3. 两个简单的Demo示例向读者展示Flash和ASP.NET交互原理以及过程

    ASP.NET与FLASH交互学习了ASP.NET的基础知识之后,终于等到学习交互的时候了.请大家和我一起来进行让人激动的交互吧!本章我将用两个简单的Demo示例向读者展示Flash和ASP.NET交 ...

  4. Dubbo入门----搭建一个最简单的Demo框架

    Dubbo背景和简介 Dubbo开始于电商系统,因此在这里先从电商系统的演变讲起. 单一应用框架(ORM) 当网站流量很小时,只需一个应用,将所有功能如下单支付等都部署在一起,以减少部署节点和成本. ...

  5. c语言模拟自动饮料机,C语言--小程序--简单模拟ATM机

    原标题:C语言--小程序--简单模拟ATM机 ATM.H #ifndef ATM_h #define ATM_h #include #include #include typedef struct _ ...

  6. C语言/C++常见习题问答集锦(五十二) 之职工信息管理系统

    C语言/C++常见习题问答集锦(五十二) 之职工信息管理系统 程序之美 用C语言,职工信息管理系统具体要求 1.基本信息:如工号.姓名.性别.年龄.学历.住址.电话号码.工资等. 2.各职工信息用结构 ...

  7. (C语言)数据库简单实现

    (C语言)数据库简单实现 介绍 一.数据结构 自定义基础数据类型 数据字典表数据结构 表信息存储 列信息存储 自定义表信息存储 数据块头信息 数据项(元组)存储信息 过滤表达式结构 其他 二.全局变量 ...

  8. c语言如何编程出声音,C/C++知识点之C语言播放声音最简单的两种方法

    本文主要向大家介绍了C/C++知识点之C语言播放声音最简单的两种方法,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助.1. 如果仅需要播放波形文件wav格式的声音,很简单,只需一句话 ...

  9. 编写C语言的最简单小程序Hello world和函数使用

    编写C语言的最简单小程序Hello world 一.示例一 1.编写demo.c程序 #include<stdio.h> int main() {printf("Hello wo ...

最新文章

  1. 参加IBM Rational高峰论坛的会议笔记
  2. 盘外招无法击垮比特币现金(BCH)的意志
  3. Oracle Study之--Oracle等待事件(2)
  4. 九、多表模型创建,一对一,一对多,基于对像的多表模型等
  5. JavaFX学习之Web
  6. java 集合读写同步_JAVA多线程学习十六 - 同步集合类的应用
  7. mariadb mysql 配置文件_MariaDB/MySQL配置文件my.cnf解读
  8. linux系统登陆问题,Linux之登陆问题
  9. 数据集市的建立方法_在集市上工作时如何建立专业网络
  10. python3 三级菜单-基础版
  11. 李开复系列--成功、自信、快乐
  12. java文件无法导出excel文件,【excel表格文件格式无效】java导出excel,excel打不开,报文件格式无效,怎么解决!...
  13. 关于在windows中配置flew,glfw
  14. 移动wifi宝显示无服务器,优游宝4G随身WiFi解决方案 云SIM技术无需插卡
  15. 彼得德鲁克《卓有成效的管理者》——阅读摘要
  16. 如何制作千人千面的NFT?如何存储NFT?#Crystals #nft.storage #ipfs
  17. LF-YOLO: A Lighter and Faster YOLO for Weld Defect Detection of X-ray Image
  18. 联通电信校园促销加码 策略更隐蔽
  19. 我们无法创建新分区。【错误:0x80042468】
  20. 杭电2019多校第三场 HDU-6608 Fansblog

热门文章

  1. oracle asm 错误集
  2. ubuntu 的问题,我一个人使用,却显示两人登录?
  3. CRFsuite 学习: CoNLL 2000 shared task
  4. 我应关注的AEC算法细分
  5. ViT (Vision Transformer) ---- Vision Transformer
  6. 机器学习--支持向量机(六)径向基核函数(RBF)详解
  7. maven下载安装环境配置
  8. java读取mysql配置文件_MySql主从复制,从原理到实践
  9. bzoj4974: [Lydsy1708月赛]字符串大师
  10. [py]flask从0到1-模板/增删改查