在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

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

C語言簡(jiǎn)單模擬委托與簡(jiǎn)單模擬反射

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

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

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

1、簡(jiǎn)單模擬委托

//C語言簡(jiǎn)單模擬委托
//需要用的指針函數(shù)。通過用指針函數(shù)作為地址接收函數(shù)地址,以達(dá)到委托其他函數(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、簡(jiǎn)單模擬反射

(1)簡(jiǎn)單模擬反射

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

#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ù)組添加成員的動(dòng)作。

借助此機(jī)制,回調(diào)函數(shù)可以在任意文件聲明,不需要修改其他文件。自定義段的起始和結(jié)束地址,可以通過變量 __ start_SECTIONNAME 和 __ stop_SECTIONNAME得到例如通過 __ attribute __ ((section("ss"))定義自定義段,其開始地址為 & __ start_ss,結(jié)束地址為 & __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);
}

//編譯器會(huì)自動(dòng)提供__start_ss,__stop_ss標(biāo)志段ss的起止地址
externsize_t__start_ss;
externsize_t__stop_ss;

typedefstruct{
void(*p)(int,int);
}node_t;

//結(jié)構(gòu)體變量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結(jié)構(gòu)中的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

*/

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

文章出處:【微信公眾號(hào):硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

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

    關(guān)注

    11

    文章

    1865

    瀏覽量

    32771
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7628

    瀏覽量

    139706
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4365

    瀏覽量

    63855

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

文章出處:【微信號(hào):mcu168,微信公眾號(hào):硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    簡(jiǎn)單交通燈并簡(jiǎn)單模擬車輛運(yùn)行方向

    一個(gè)簡(jiǎn)單的交通燈,并用布爾數(shù)組模擬車輛運(yùn)行方向。新手學(xué)習(xí),請(qǐng)多多指教,努力改進(jìn)。
    發(fā)表于 04-27 13:31

    求各種簡(jiǎn)單模擬電路圖

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

    單模光纖-你應(yīng)該選擇什么樣的?

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

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

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

    DigiPCBA 庫遷移系列 - 簡(jiǎn)單模

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

    塔臺(tái)模擬機(jī)飛行進(jìn)程單模塊的設(shè)計(jì)與實(shí)現(xiàn)

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

    LOG100的簡(jiǎn)單模式對(duì)數(shù)放大電路

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

    SIMULINK簡(jiǎn)單模型的建立及模型特點(diǎn)

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

    S7-200簡(jiǎn)單模擬量編程程序

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

    簡(jiǎn)單模擬控制的單相VIENNA整流器研究

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

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

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

    單模光纖1550nm衰減為多少

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

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

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

    簡(jiǎn)單認(rèn)識(shí)單模光纖耦合器

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

    多模和單模的光纜哪個(gè)更貴

    單模光纜通常比多模光纜更貴,具體原因如下: 光纖成本: 單模光纖:設(shè)計(jì)用于長(zhǎng)距離傳輸,制造工藝更復(fù)雜,材料要求更高,導(dǎo)致成本相對(duì)較高。 多模光纖:適用于短距離傳輸,制造工藝相對(duì)簡(jiǎn)單,材料成本較低
    的頭像 發(fā)表于 04-27 09:54 ?60次閱讀
    主站蜘蛛池模板: 2018国产大陆天天弄 | 巨大欧美黑人xxxxbbbb | 黄 色 免费网 站 成 人 | 国产一区中文字幕在线观看 | 欧美一级在线观看 | 女人张腿让男桶免费视频观看 | 中文字幕网资源站永久资源 | 美女在线看永久免费网址 | 日韩精品视频免费观看 | 亚洲图片欧美色图 | 国产一区二区三区毛片 | 国产五月婷婷 | 国产成在线观看免费视频 | 国产精品福利午夜一级毛片 | 日日操夜夜操天天操 | 中文字幕视频二区 | 曰本在线 | 三级国产在线观看 | 免费看黄视频的网站 | 特黄大片aaaaa毛片 | julia一区二区三区中文字幕 | 中文字幕一区二区三区有限公司 | 美女脱裤子屁屁视频 | 色在线播放 | 日本黄色大全 | 午夜看一级特黄a大片黑 | 亚洲欧美国产高清va在线播放 | 国产一级特黄aaa大片 | 国产精品人人爱一区二区白浆 | 色猫av| 人人做人人干 | 国产一卡二卡≡卡四卡无人 | 美女张开腿让男人桶爽 | 免费人成在线观看网站品爱网 | 好吊色37pao在线观看 | 久久伊人男人的天堂网站 | 午夜寂寞视频在线观看 | 五月天婷婷网亚洲综合在线 | 色多多在线免费观看 | 一区二区三区网站在线免费线观看 | 永久免费人成网ww555kkk手机 |