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

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

3天內(nèi)不再提示

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

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

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

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

1、簡單模擬委托

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

intmain()//主函數(shù)用做主調(diào)函數(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()//回調(diào)函數(shù)0
{
printf("cmd0");
}

voidf1()//回調(diào)函數(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ù)組添加成員的動作。

借助此機制,回調(diào)函數(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語言使用回調(diào)函數(shù)模擬委托與反射

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

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

    關注

    11

    文章

    1733

    瀏覽量

    31982
  • C語言
    +關注

    關注

    180

    文章

    7581

    瀏覽量

    135574
  • 函數(shù)
    +關注

    關注

    3

    文章

    4260

    瀏覽量

    62228

原文標題:C語言使用回調(diào)函數(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ū)的分析,軟件自己在后臺會經(jīng)過一系列的處理,預先自動選擇遷移過程的所有方面,然后
    發(fā)表于 07-08 09:56

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

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

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

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

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

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

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

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

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

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

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

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

    單模單纖和單模雙纖有什么區(qū)別

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

    單模光纖1550nm衰減為多少

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

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

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

    簡單認識單模光纖耦合器

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