一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

3天內不再提示

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

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

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

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

1、簡單模擬委托

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

intmain()//主函數(shù)用做主調函數(shù)
{
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)簡單模擬反射

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

#include
#include

typedefvoid(*callback)(void);

typedefstruct{
constchar*name;
callbackfn;
}callback_t;

voidf0();
voidf1();

callback_tcallbacks[]={
{"cmd0",f0},
{"cmd1",f1},
};

voidf0()//回調函數(shù)0
{
printf("cmd0");
}

voidf1()//回調函數(shù)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())),將函數(shù)、變量放到指定的數(shù)據(jù)段中。也就是說,可以讓編譯器幫我們完成上例中向數(shù)組添加成員的動作。

借助此機制,回調函數(shù)可以在任意文件聲明,不需要修改其他文件。自定義段的起始和結束地址,可以通過變量 __ 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,執(zhí)行node_t結構中的p指向的函數(shù)
for(p=(node_t*)&__start_ss;pnode_t*)&__stop_ss;p++){
p->p(a,b);
a+=1;b+=2;
}
}
/*
func_167
func_21024

*/

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

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

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

    關注

    11

    文章

    1865

    瀏覽量

    32781
  • C語言
    +關注

    關注

    180

    文章

    7628

    瀏覽量

    139835
  • 函數(shù)
    +關注

    關注

    3

    文章

    4365

    瀏覽量

    63912

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

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

收藏 人收藏

    評論

    相關推薦
    熱點推薦

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

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

    求各種簡單模擬電路圖

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

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

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

    藍牙單模和雙模的區(qū)別

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

    DigiPCBA 庫遷移系列 - 簡單模

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

    塔臺模擬機飛行進程單模塊的設計與實現(xiàn)

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

    LOG100的簡單模式對數(shù)放大電路

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

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

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

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

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

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

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

    單模單纖與單模雙纖的區(qū)別

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

    單模光纖和多模光纖的型號區(qū)別是什么

    。纖維芯是光信號的主要傳輸介質,而包層則用于保護纖維芯并提供反射光信號的內部反射。 模式結構 單模光纖和多模光纖的最主要區(qū)別在于它們的纖維芯的尺寸和傳輸模式。 單模光纖:
    的頭像 發(fā)表于 04-09 17:30 ?2350次閱讀

    單模單纖與單模雙纖的哪個穩(wěn)定?

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

    簡單認識單模光纖耦合器

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

    多模和單模的光纜哪個更貴

    單模光纜通常比多模光纜更貴,具體原因如下: 光纖成本: 單模光纖:設計用于長距離傳輸,制造工藝更復雜,材料要求更高,導致成本相對較高。 多模光纖:適用于短距離傳輸,制造工藝相對簡單,材料成本較低
    的頭像 發(fā)表于 04-27 09:54 ?75次閱讀