C语言之最简单回调demo(五)
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(五)相关推荐
- 《Go语言圣经》学习笔记 第五章函数
<Go语言圣经>学习笔记 第五章 函数 目录 函数声明 递归 多返回值 匿名函数 可变参数 Deferred函数 Panic异常 Recover捕获异常 注:学习<Go语言圣经> ...
- Dubbo入门介绍---搭建一个最简单的Demo框架
Dubbo入门---搭建一个最简单的Demo框架 置顶 2017年04月17日 19:10:44 是Guava不是瓜娃 阅读数:320947 标签: dubbo zookeeper 更多 个人分类: ...
- 两个简单的Demo示例向读者展示Flash和ASP.NET交互原理以及过程
ASP.NET与FLASH交互学习了ASP.NET的基础知识之后,终于等到学习交互的时候了.请大家和我一起来进行让人激动的交互吧!本章我将用两个简单的Demo示例向读者展示Flash和ASP.NET交 ...
- Dubbo入门----搭建一个最简单的Demo框架
Dubbo背景和简介 Dubbo开始于电商系统,因此在这里先从电商系统的演变讲起. 单一应用框架(ORM) 当网站流量很小时,只需一个应用,将所有功能如下单支付等都部署在一起,以减少部署节点和成本. ...
- c语言模拟自动饮料机,C语言--小程序--简单模拟ATM机
原标题:C语言--小程序--简单模拟ATM机 ATM.H #ifndef ATM_h #define ATM_h #include #include #include typedef struct _ ...
- C语言/C++常见习题问答集锦(五十二) 之职工信息管理系统
C语言/C++常见习题问答集锦(五十二) 之职工信息管理系统 程序之美 用C语言,职工信息管理系统具体要求 1.基本信息:如工号.姓名.性别.年龄.学历.住址.电话号码.工资等. 2.各职工信息用结构 ...
- (C语言)数据库简单实现
(C语言)数据库简单实现 介绍 一.数据结构 自定义基础数据类型 数据字典表数据结构 表信息存储 列信息存储 自定义表信息存储 数据块头信息 数据项(元组)存储信息 过滤表达式结构 其他 二.全局变量 ...
- c语言如何编程出声音,C/C++知识点之C语言播放声音最简单的两种方法
本文主要向大家介绍了C/C++知识点之C语言播放声音最简单的两种方法,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助.1. 如果仅需要播放波形文件wav格式的声音,很简单,只需一句话 ...
- 编写C语言的最简单小程序Hello world和函数使用
编写C语言的最简单小程序Hello world 一.示例一 1.编写demo.c程序 #include<stdio.h> int main() {printf("Hello wo ...
最新文章
- 参加IBM Rational高峰论坛的会议笔记
- 盘外招无法击垮比特币现金(BCH)的意志
- Oracle Study之--Oracle等待事件(2)
- 九、多表模型创建,一对一,一对多,基于对像的多表模型等
- JavaFX学习之Web
- java 集合读写同步_JAVA多线程学习十六 - 同步集合类的应用
- mariadb mysql 配置文件_MariaDB/MySQL配置文件my.cnf解读
- linux系统登陆问题,Linux之登陆问题
- 数据集市的建立方法_在集市上工作时如何建立专业网络
- python3 三级菜单-基础版
- 李开复系列--成功、自信、快乐
- java文件无法导出excel文件,【excel表格文件格式无效】java导出excel,excel打不开,报文件格式无效,怎么解决!...
- 关于在windows中配置flew,glfw
- 移动wifi宝显示无服务器,优游宝4G随身WiFi解决方案 云SIM技术无需插卡
- 彼得德鲁克《卓有成效的管理者》——阅读摘要
- 如何制作千人千面的NFT?如何存储NFT?#Crystals #nft.storage #ipfs
- LF-YOLO: A Lighter and Faster YOLO for Weld Defect Detection of X-ray Image
- 联通电信校园促销加码 策略更隐蔽
- 我们无法创建新分区。【错误:0x80042468】
- 杭电2019多校第三场 HDU-6608 Fansblog
热门文章
- oracle asm 错误集
- ubuntu 的问题,我一个人使用,却显示两人登录?
- CRFsuite 学习: CoNLL 2000 shared task
- 我应关注的AEC算法细分
- ViT (Vision Transformer) ---- Vision Transformer
- 机器学习--支持向量机(六)径向基核函数(RBF)详解
- maven下载安装环境配置
- java读取mysql配置文件_MySql主从复制,从原理到实践
- bzoj4974: [Lydsy1708月赛]字符串大师
- [py]flask从0到1-模板/增删改查