下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第第页C语言使用回调函数模拟委托与反射
函数是(C语言)的核心概念。主调函数(caller)调用被调函数(callee)是一般的调用关系,如果被调函数(callee)参数包含函数指针,函数指针还可以形成多一层的调用关系,形成第三方函数的调用,专业术语称为回调(callb(ac)k),通过函数指针参数调用的第三方函数称为回调函数。
回调可以让被调函数(这里是指用函数指针做函数参数的函数)的代码更加泛化或抽象,能够简单(模拟)其它(编程)语言的委托与反射语法。
1、简单模拟委托
//C语言简单模拟委托//需要用的指针函数。通过用指针函数作为地址接收函数地址,以达到委托其他函数实现某方法的目的。#includetypedefvoid(*fun)();//typedef把void(*)()类型重命名为funvoidfunc(fun);//被调函数voidfunc_1();//回调函数1voidfunc_2();//回调函数2intmain()//主函数用做主调函数{func(func_1);funf=func_2;f();func(func_1);func(func_2);getchar();return0;}voidfunc(funf)//funf为地址,fun*f为f指向的地址的量或者其他{printf("func");if(f!=NULL){f();}}voidfunc_1(){printf("func_1");}voidfunc_2(){printf("func_2");}/*funcfunc_1func_2funcfunc_1funcfunc_2*/
2、简单模拟反射
(1)简单模拟反射
高级语言的反射机制,简单来说就是可以通过字符串型获取对应的类或者函数。
下面用C来简单模拟反射:
#include#includetypedefvoid(*callback)(void);typedefstruct{constchar*name;callbackfn;}callback_t;voidf0();voidf1();callback_tcallbacks[]={{"cmd0",f0},{"cmd1",f1},};voidf0()//回调函数0{printf("cmd0");}voidf1()//回调函数1{printf("cmd1");}voiddo_callback(constchar*name){size_ti;f(or)(i=0;i
(2)利用自定义段
gcc支持通过使用__attribu(te)__((sec(ti)on())),将函数、变量放到指定的数据段中。
也就是说,可以让编译器帮我们完成上例中向数组添加成员的动作。借助此机制,回调函数可以在任意文件声明,不需要修改其他文件。自定义段的起始和结束地址,可以通过变量__start_SECTIONNAME和__stop_SECTIONNAME得到例如通过__attribute__((section("ss"))定义自定义段,其开始地址为}voidfunc_2(inta,intb){printf("%s%d%d",__func__,__LINE__,a*b);}//编译器会自动提供__start_ss,__stop_ss标志段ss的起止地址externsize_t__start_ss;externsize_t__stop_ss;typedefstruct{void(*p)(int,int);}node_t;//结构体变量a位于自定义段ssSECnode_ta={.p=func_1,};SECnode_tb={.p=func_2,};intmain(intargc,char**argv){inta=3,b=4;node_t*p;//遍历段ss,执行node_t结构中的p指向的函数
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 极地生态旅游活动环境影响评估与可持续管理框架
- 2026及未来5年中国工业级硫酸铜市场现状分析及前景预测报告
- 压疮护理课件下载教程
- 抗生素临床考试题及答案2026年版
- 叙事护理与患者体验提升
- 房建监理旁站方案
- 潍坊市2025山东潍坊峡山区全员岗位聘任制人才公开招聘笔试历年参考题库典型考点附带答案详解
- 湖南省2025湖南怀化市养老和工伤保险服务中心招聘公益性岗位工作人员2人笔试历年参考题库典型考点附带答案详解
- 2026青海省交通建设管理有限公司校园引才招聘及总笔试历年参考题库附带答案详解
- 2026重庆中江船业有限公司技术人员招聘5人笔试历年参考题库附带答案详解
- 山东铁投能源集团、山东清洁热网有限公司招聘笔试题库2026
- 2026浙江杭州市上城区人民政府南星街道办事处编外人员招聘1人笔试模拟试题及答案解析
- 2026《电力重大事故隐患判定标准》解读
- 中国对外文化集团公司招聘笔试题库2026
- 筑牢心理健康防线守护阳光心态4年级主题班会课件
- 《智慧零碳工业园区设计和评价技术指南》标准征求意见稿
- 《园林垃圾处理技术指南》征求意见稿
- 航运企业安全管理实施指南(标准版)
- 雨课堂学堂在线学堂云《人工智能导论》单元测试考核答案
- 住宅烟道系统技术标准
- GB 16897-2022制动软管的结构、性能要求及试验方法
评论
0/150
提交评论