精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

C語言簡單模擬委托與簡單模擬反射

GReq_mcu168 ? 來源:小智雅匯 ? 作者:小智雅匯 ? 2022-03-09 17:17 ? 次閱讀

函數是C語言的核心概念。主調函數(caller)調用被調函數(callee)是一般的調用關系,如果被調函數(callee)參數包含函數指針,函數指針還可以形成多一層的調用關系,形成第三方函數的調用,專業術語稱為回調(callback),通過函數指針參數調用的第三方函數稱為回調函數。

回調可以讓被調函數(這里是指用函數指針做函數參數的函數)的代碼更加泛化或抽象,能夠簡單模擬其它編程語言的委托與反射語法。

1、簡單模擬委托

//C語言簡單模擬委托
//需要用的指針函數。通過用指針函數作為地址接收函數地址,以達到委托其他函數實現某方法的目的。
#include
typedefvoid(*fun)();//typedef把void(*)()類型重命名為fun
voidfunc(fun);//被調函數
voidfunc_1();//回調函數1
voidfunc_2();//回調函數2

intmain()//主函數用做主調函數
{
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
");
}
/*
func
func_1
func_2
func
func_1
func
func_2
*/

2、簡單模擬反射

(1)簡單模擬反射

高級語言的反射機制,簡單來說,就是可以通過字符串型獲取對應的類或者函數。下面,用C來簡單模擬反射:

#include
#include

typedefvoid(*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;isizeof(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位于自定義段ss
SECnode_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;pnode_t*)&__stop_ss;p++){
p->p(a,b);
a+=1;b+=2;
}
}
/*
func_167
func_21024

*/

原文標題:C語言使用回調函數模擬委托與反射

文章出處:【微信公眾號:硬件攻城獅】歡迎添加關注!文章轉載請注明出處。

審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 參數
    +關注

    關注

    11

    文章

    1786

    瀏覽量

    32090
  • C語言
    +關注

    關注

    180

    文章

    7599

    瀏覽量

    136213
  • 函數
    +關注

    關注

    3

    文章

    4307

    瀏覽量

    62433

原文標題:C語言使用回調函數模擬委托與反射

文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    簡單交通燈并簡單模擬車輛運行方向

    一個簡單的交通燈,并用布爾數組模擬車輛運行方向。新手學習,請多多指教,努力改進。
    發表于 04-27 13:31

    求各種簡單模擬電路圖

    求各種簡單模擬電路圖
    發表于 04-07 22:16

    單模光纖-你應該選擇什么樣的?

    的多樣性決定的。本文不僅僅涉及ITU-T和IEC的術語,也提及了簡單的ITU-T G.65X。總體上有19種不同的單模光纖,它們的型號是由ITU-T定義的,這里將介紹一下單模光纖的種類。 每種類型的
    發表于 08-24 11:39

    藍牙單模和雙模的區別

    藍牙4.0是在藍牙技術的基礎上發展起來的,既同于藍牙,又區別于傳統藍牙。藍牙4.0設備分單模和雙模兩種,雙模簡稱BR,商標為Bluetooth Smart Ready;單模簡稱BLE或者LE,商標為
    發表于 11-29 14:15

    DigiPCBA 庫遷移系列 - 簡單模

    簡單界面模式和高級模式兩種模式,文中介紹了四種方式來讓您以簡單模式訪問遷移器。庫遷移器的簡單模式會根據其對源庫和連接的工作區的分析,軟件自己在后臺會經過一系列的處理,預先自動選擇遷移過程的所有方面,然后
    發表于 07-08 09:56

    塔臺模擬機飛行進程單模塊的設計與實現

    飛行進程單模塊是管制員用來記錄飛行計劃基本信息、管制員指令等相關內容信息,是塔臺模擬機系統中的一個重要功能模塊。分析了面向服務架構(SOA)體系的概念及其所具有的
    發表于 12-14 14:02 ?26次下載

    LOG100的簡單模式對數放大電路

    LOG100的簡單模式對數放大電路 如圖所示為LOG100的簡單模式對數放大電路。信號輸入電流I1、I2經過LOG100變換為對數輸出VOUT=K·LOG(I1/I2)。從
    發表于 05-15 23:06 ?4339次閱讀
    LOG100的<b class='flag-5'>簡單模</b>式對數放大電路

    SIMULINK簡單模型的建立及模型特點

    SIMULINK簡單模型的建立及模型特點1、簡單模型的建立    exp5_1.mdl(1)建立模型窗口(2)將功能模塊由模塊庫窗口復制到模型窗口(3)對模塊進
    發表于 06-19 12:48 ?2778次閱讀

    S7-200簡單模擬量編程程序

    西門子S7-200簡單模擬量編程范例,西門子S7-200簡單模擬量編程范例,TITLE=//子程序1:數據采集部份
    發表于 06-21 12:02 ?9951次閱讀

    簡單模擬控制的單相VIENNA整流器研究

    針對單相單開關三電平(VIENNA)整流器提出了新的簡單模擬控制方案。該方案以單周期控制技術為基礎,結構簡單,無需R-S 觸發器,在實現較高輸入功率因數的同時,僅用單個電壓環即
    發表于 09-22 16:30 ?61次下載
    <b class='flag-5'>簡單模擬</b>控制的單相VIENNA整流器研究

    單模單纖與單模雙纖的區別

    單模單纖與單模雙纖的區別? 單模單纖(single mode single fiber,SMF)和單模雙纖(single mode dual fiber,SMDF)是光纖通信中常見的兩
    的頭像 發表于 12-08 10:41 ?4631次閱讀

    單模單纖和單模雙纖有什么區別

    單模單纖和單模雙纖是光纖傳輸中兩種常見的模式。單模指的是一種傳輸光信號的模式,單纖和雙纖指的是光纖中的纖芯數量。下面將詳細介紹單模單纖和單模
    的頭像 發表于 12-20 14:40 ?8441次閱讀

    單模光纖1550nm衰減為多少

    的衰減情況,逐步介紹衰減的原因和影響因素。 一、單模光纖的基本原理和結構 單模光纖的基本原理是通過光的反射和折射來傳輸信號。它由光纖芯和包層兩部分組成,其中光纖芯是光信號傳輸的主體,而包層則起到保護和光信號的引導作用。 二、
    的頭像 發表于 04-03 17:37 ?2056次閱讀

    單模單纖與單模雙纖的哪個穩定?

    單模單纖與單模雙纖是兩種常見的光纖通信方式,它們在穩定性、傳輸距離、成本等方面存在一定的差異。 一、單模單纖與單模雙纖的基本概念 1.1 單模
    的頭像 發表于 08-08 17:03 ?745次閱讀

    簡單認識單模光纖耦合器

    單模光纖耦合器(Single Mode Fiber Coupler)是一種專門設計用于單模光纖的光學器件,它屬于光被動元件領域,主要用于實現光信號的分路/合路,或用于延長光纖鏈路。在光纖通信系統中,單模光纖耦合器扮演著至關重要的
    的頭像 發表于 08-09 10:08 ?501次閱讀