C语言使用回调函数模拟委托与反射_第1页
C语言使用回调函数模拟委托与反射_第2页
C语言使用回调函数模拟委托与反射_第3页
C语言使用回调函数模拟委托与反射_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第第页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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论