您的位置 首页 电子技术

C语言简单模拟委托与简单模拟反射

函数是C语言的核心概念。主调函数(caller)调用被调函数(callee)是一般的调用关系,如果被调函数(callee)参数包含函数指针,函数指针还可以形成多一层的调用关系,形成第三方函数的调用,专业术语称为回调(callback),通过函数指针参数调用的第三方函数称为回调函数。\” />

<meta http-equiv=X-UA-Compatible content=\"IE=edge,chrome=1

函数是C语言的核心概念。主调函数(caller)调用被调函数(callee)是一般的调用关系,如果被调函数(callee)参数包含函数指针,函数指针还可以形成多一层的调用关系,形成第三方函数的调用,专业术语称为回调(callback),通过函数指针参数调用的第三方函数称为回调函数。

回调可以让被调函数(这里是指用函数指针做函数参数的函数)的代码更加泛化或抽象,能够简单模拟其它编程语言的委托与反射语法。

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;for(i=0;i< sizeof(callbacks)/sizeof(callbacks[0]);i++){if(!strcmp(callbacks[i].name,name)){callbacks[i].fn();}}}intmain(){do_callback(\"cmd1\");getchar();return0;}

(2)利用自定义段

gcc支持通过使用 __ attribute __ ((section())),将函数、变量放到指定的数据段中。也就是说,可以让编译器帮我们完成上例中向数组添加成员的动作。

借助此机制,回调函数可以在任意文件声明,不需要修改其他文件。自定义段的起始和结束地址,可以通过变量 __ start_SECTIONNAME 和 __ stop_SECTIONNAME得到例如通过 __ attribute __ ((section(\”ss\”))定义自定义段,其开始地址为 & __ start_ss,结束地址为 & __stop_ss。

//https://www.bejson.com/runcode/c920/#include#defineSEC__attribute__((__section__(\"ss\"),aligned(sizeof(void*))))voidfunc_1(inta,intb){printf(\"%s%d%d\",__func__,__LINE__,a+b);}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指向的函数for(p=(node_t*)&__start_ss;pp(a,b);a+=1;b+=2;}}/*func_167func_21024*/

免责声明:文章内容不代表本站立场,本站不对其内容的真实性、完整性、准确性给予任何担保、暗示和承诺,仅供读者参考,文章版权归原作者所有。如本文内容影响到您的合法权益(内容、图片等),请及时联系本站,我们会及时删除处理。

作者: admin

为您推荐

智慧路灯照明系统的应用为智慧城市的发展建设添砖加瓦

智慧路灯照明系统的应用为智慧城市的发展建设添砖加瓦

智慧路灯照明系统的应用为智慧城市的发展建设添砖加瓦-夜间的路灯不仅照亮了黑暗的街道,而且照亮了回家的道路。从街上望去,闪烁的路灯发出暖光,指引着我们家的方向。城市里的路灯就像“守护者”,给长途旅行回来的游客带来了极大的安全感。 当今,路灯智能控制时代的到来,极大地促进了传统路灯的人工机械化运行。虽然对此感到兴奋,但我们不禁要问:随着路灯智能控制的早期到来,除了改善路灯的运行模式,还能带来什么? 为城市交通提供安全保障 城市公共照明系统中的智能路灯在每个路

晶振在五种不同行业中的应用说明

晶振在五种不同行业中的应用说明-晶振在五种不同行业的应用-由TST嘉硕代理KOYU光与电子

几种不同的物联网控制APP模式

本文就简单介绍当前几种物联网控制APP模式,让大家了解几种不同的技术路线。\” />

<meta http-equiv=X-UA-Compatible content=\"IE=edge,chrome=1

苹果稳坐全球可穿戴设备数量首位,占据日本市场超7成份额

苹果稳坐全球可穿戴设备数量首位,占据日本市场超7成份额

苹果公司占据2021年日本第四季度可穿戴设备71.5%份额,占据全球可穿戴设备市场34.9%份额。\” />

<meta http-equiv=X-UA-Compatible content=\"IE=edge,chrome=1

如何用GPUDirect存储器如何缓解CPU I / O瓶颈

除了使用 GPUs 而不是 CPU 加快计算的好处外,一旦整个数据处理管道转移到 GPU 执行,直接存储就起到了一个力倍增器的作用。这一点变得尤为重要,因为数据集大小不再适合系统内存,而且 GPUs 的数据 I / O 增长成为处理时间的瓶颈。当人工智能和数据科学继续重新定义可能的艺术时,启用直接路径可以减少甚至完全缓解这个瓶颈。\” />

<meta http-equiv=X-UA-Compatible content=\"IE=edge,chrome=1

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

返回顶部