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

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

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

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

C語言使用回調(diào)函數(shù)模擬委托與反射

STM32嵌入式開發(fā) ? 來源:STM32嵌入式開發(fā) ? 作者:STM32嵌入式開發(fā) ? 2022-03-14 10:19 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

函數(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ù))的代碼更加泛化或抽象,能夠簡單模擬其它編程語言的委托與反射語法。

1 簡單模擬委托

//C語言簡單模擬委托//需要用的指針函數(shù)。通過用指針函數(shù)作為地址接收函數(shù)地址,以達到委托其他函數(shù)實現(xiàn)某方法的目的。#include typedef void(* fun)(); //typedef 把void(*)()類型重命名為funvoid func(fun); // 被調(diào)函數(shù)void func_1(); // 回調(diào)函數(shù)1void func_2(); // 回調(diào)函數(shù)2 int main() // 主函數(shù)用做主調(diào)函數(shù){ func(func_1); fun f = func_2; f(); func(func_1); func(func_2); getchar(); return 0;}void func(fun f) //fun f為地址,fun * f為f指向的地址的量或者其他{ printf("func "); if (f != NULL) { f(); }}void func_1(){ printf("func_1 ");}void func_2(){ printf("func_2 ");}/*funcfunc_1func_2funcfunc_1funcfunc_2*/

2 簡單模擬反射

(1)簡單模擬反射

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

#include #include typedef void (*callback)(void); typedef struct { const char *name; callback fn;}callback_t; void f0();void f1(); callback_t callbacks[] = { {"cmd0", f0}, {"cmd1", f1},}; void f0() // 回調(diào)函數(shù)0{ printf("cmd0");} void f1() // 回調(diào)函數(shù)1{ printf("cmd1");} void do_callback(const char *name) { size_t i; for (i = 0; i < sizeof(callbacks) / sizeof(callbacks[0]); i++) { if (!strcmp(callbacks[i].name, name)) { callbacks[i].fn(); } }} int main(){ do_callback("cmd1"); getchar(); return 0;}

(2)利用自定義段

gcc支持通過使用 __ attribute __ ((section())),將函數(shù)、變量放到指定的數(shù)據(jù)段中。也就是說,可以讓編譯器幫我們完成上例中向數(shù)組添加成員的動作。

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

// https://www.bejson.com/runcode/c920/#include #define SEC __attribute__((__section__("ss"), aligned(sizeof(void*)))) void func_1 (int a, int b){ printf("%s %d %d ", __func__, __LINE__, a+b); }void func_2 (int a, int b){ printf("%s %d %d ", __func__, __LINE__, a*b); } // 編譯器會自動提供__start_ss,__stop_ss標(biāo)志段ss的起止地址extern size_t __start_ss;extern size_t __stop_ss; typedef struct { void (*p)(int, int);} node_t; // 結(jié)構(gòu)體變量a位于自定義段ssSEC node_t a = { .p = func_1, };SEC node_t b = { .p = func_2, };int main(int argc, char **argv){ int a = 3, b = 4; node_t *p; // 遍歷段ss,執(zhí)行node_t結(jié)構(gòu)中的p指向的函數(shù) for (p = (node_t *)&__start_ss; p < (node_t *)&__stop_ss;p++) { p->p(a, b); a+=1;b+=2; }}/*func_1 6 7func_2 10 24 */

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

    關(guān)注

    180

    文章

    7631

    瀏覽量

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

    關(guān)注

    3

    文章

    4379

    瀏覽量

    64616
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1659

    瀏覽量

    50094

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

文章出處:【微信號:c-stm32,微信公眾號:STM32嵌入式開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    深入理解C語言函數(shù)—編程中的“積木塊”藝術(shù)

    在編程的世界里,函數(shù)就像建筑中的“積木塊”——它們是構(gòu)建復(fù)雜程序的基石。通過靈活組合這些模塊,開發(fā)者能打造出功能強大且結(jié)構(gòu)清晰的代碼。函數(shù)之所以成為C語言的核心,正是因為它解決了編程中
    的頭像 發(fā)表于 06-30 17:26 ?541次閱讀
    深入理解<b class='flag-5'>C</b><b class='flag-5'>語言</b>:<b class='flag-5'>函數(shù)</b>—編程中的“積木塊”藝術(shù)

    為什么中斷回調(diào)函數(shù)中不能使用接收中斷開啟函數(shù)

    我看(書是基于stm32f407編寫)書上說在串口接收中斷回調(diào)函數(shù)里面不能使用 接收中斷開啟函數(shù),書上是利用自己創(chuàng)建了空閑中斷回調(diào)函數(shù),在這
    發(fā)表于 05-28 07:19

    如何使用自定義設(shè)置回調(diào)函數(shù)?

    你好,我正在嘗試編寫自己的自定義設(shè)置回調(diào)函數(shù),并使用 fastEnum=false。 是否有任何代碼示例或資料可供我參考? void CyU3PUsbRegisterSetupCallback
    發(fā)表于 05-21 06:11

    為什么中斷回調(diào)函數(shù)中不能使用接收中斷開啟函數(shù)

    我看(書是基于stm32f407編寫)書上說在串口接收中斷回調(diào)函數(shù)里面不能使用 接收中斷開啟函數(shù),書上是利用自己創(chuàng)建了空閑中斷回調(diào)函數(shù),在這
    發(fā)表于 04-22 08:19

    為什么不需要給回調(diào)函數(shù)傳遞參數(shù)

    調(diào)函數(shù)C語言里面一個重要機制。
    的頭像 發(fā)表于 04-15 10:11 ?300次閱讀

    VirtualLab Fusion應(yīng)用:具有粗糙表面的回復(fù)反射器的反射

    系統(tǒng)設(shè)置 當(dāng)試圖將獨立于入射方向的光大致反射回同一方向時,通常可以使用回復(fù)反射器。 這個演示展示了如何在非序列場追跡的幫助下對這種結(jié)構(gòu)進行建模。它還包括通過在表面上應(yīng)用隨機函數(shù)來對
    發(fā)表于 04-02 08:49

    解鎖TSMaster fifo函數(shù):報文讀取的高效方法

    前言:TSMaster目前有兩種讀取報文的模式:回調(diào)函數(shù)模式和fifo模式。fifo函數(shù)是TSMaster近期新增的函數(shù),本文將重點介紹fifo模塊。關(guān)于回
    的頭像 發(fā)表于 03-14 20:04 ?435次閱讀
    解鎖TSMaster fifo<b class='flag-5'>函數(shù)</b>:報文讀取的高效方法

    C語言如何處理函數(shù)的返回值

    的那樣,直接把 1234 賦值給了變量 ret? 搞懂這個問題不難,只要看下匯編代碼就行。 把代碼編譯一下,只編譯不鏈接,得到的就是C對應(yīng)的匯編代碼。 這塊是 test 函數(shù),不用管上面這些代碼,如果一行一行去分析,沒有匯編基礎(chǔ)的話確實會頭疼。 看下這行代碼,很明顯,12
    的頭像 發(fā)表于 01-16 09:21 ?420次閱讀

    EE-128:C語言中的DSP:從C調(diào)用匯編類成員函數(shù)

    電子發(fā)燒友網(wǎng)站提供《EE-128:C語言中的DSP:從C調(diào)用匯編類成員函數(shù).pdf》資料免費下載
    發(fā)表于 01-07 13:48 ?0次下載
    EE-128:<b class='flag-5'>C</b><b class='flag-5'>語言</b>中的DSP:從<b class='flag-5'>C</b>調(diào)用匯編類成員<b class='flag-5'>函數(shù)</b>

    C語言筆試題

    來看一個C語言筆試題,應(yīng)該很少有人能給出正確答案。 #include int f(){ printf("this is f ..."); return 1;}int g(){ printf
    的頭像 發(fā)表于 12-30 09:48 ?397次閱讀

    同樣是函數(shù),在CC++中有什么區(qū)別

    同樣是函數(shù),在 CC++ 中有什么區(qū)別? 第一個返回值。 C語言函數(shù)可以不寫返回值類型,
    的頭像 發(fā)表于 11-29 10:25 ?883次閱讀

    使用C語言實現(xiàn)函數(shù)模

      用C語言能不能實現(xiàn)一個通用的函數(shù),既能完成整數(shù)的相加,又能完成浮點數(shù)的相加?
    的頭像 發(fā)表于 11-09 11:38 ?917次閱讀

    C語言中的socket編程基礎(chǔ)

    數(shù)據(jù) 步驟6:關(guān)閉socket 創(chuàng)建socket 在C語言中,創(chuàng)建socket需要使用socket()函數(shù)。這個函數(shù)需要兩個參數(shù):域
    的頭像 發(fā)表于 11-01 16:51 ?1159次閱讀

    反射內(nèi)存卡在半實物模擬仿真中的使用以及如何使用

    反射內(nèi)存卡在半實物模擬仿真中的應(yīng)用
    的頭像 發(fā)表于 11-01 14:10 ?492次閱讀

    C語言與Java語言的對比

    C語言和Java語言都是當(dāng)前編程領(lǐng)域中的重要成員,它們各自具有獨特的優(yōu)勢和特點,適用于不同的應(yīng)用場景。以下將從語法特性、內(nèi)存管理、跨平臺性、性能、應(yīng)用領(lǐng)域等多個方面對C
    的頭像 發(fā)表于 10-29 17:31 ?1025次閱讀
    主站蜘蛛池模板: 成人欧美一区二区三区视频不卡 | 萌白酱香蕉白丝护士服喷浆 | 日本欧美一区二区三区不卡视频 | 在线观看免费av网 | 天天摸天天舔天天操 | 午夜免费福利在线观看 | 生活片黄色 | 欧美3d动漫网站 | 精品欧美小视频在线观看 | 性欧美xxx 不卡视频 | 视频在线二区 | 午夜欧美成人久久久久久 | 女人张开双腿让男人桶爽免 | 激情六月婷婷开心丁香开心 | 色盈盈| a毛片基地免费全部香蕉 | 色网站免费在线观看 | 韩国视频在线播放 | 性欧美video视频另类 | 最近2018中文字幕免费看2019 | 免费艹逼视频 | 奇米视频在线观看 | 天堂网www在线资源网 | 色片在线| 中文三 级 黄 色 片 | 天天插天天狠天天透 | 免费福利片2022潦草影视午夜 | 色噜噜噜 | 亚洲综合丁香婷婷六月香 | 在线观看永久免费 | 失禁h啪肉尿出来高h | 国产在线一区二区三区四区 | 欧洲精品码一区二区三区免费看 | 极品美女洗澡后露粉嫩木耳视频 | 欧美三级日韩三级 | 色丁香在线观看 | 欧美黄色录像视频 | 国产成人综合欧美精品久久 | 成人美女隐私免费 | 免费黄色地址 | 欧美色操 |