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

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

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

3天內不再提示

C語言使用回調函數模擬委托與反射

STM32嵌入式開發 ? 來源:STM32嵌入式開發 ? 作者:STM32嵌入式開發 ? 2022-03-14 10:19 ? 次閱讀

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

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

1 簡單模擬委托

//C語言簡單模擬委托//需要用的指針函數。通過用指針函數作為地址接收函數地址,以達到委托其他函數實現某方法的目的。#include typedef void(* fun)(); //typedef 把void(*)()類型重命名為funvoid func(fun); // 被調函數void func_1(); // 回調函數1void func_2(); // 回調函數2 int main() // 主函數用做主調函數{ 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)簡單模擬反射

高級語言的反射機制,簡單來說,就是可以通過字符串型獲取對應的類或者函數。下面,用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() // 回調函數0{ printf("cmd0");} void f1() // 回調函數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())),將函數、變量放到指定的數據段中。也就是說,可以讓編譯器幫我們完成上例中向數組添加成員的動作。

借助此機制,回調函數可以在任意文件聲明,不需要修改其他文件。自定義段的起始和結束地址,可以通過變量 __ start_SECTIONNAME 和 __ stop_SECTIONNAME得到例如通過 __ attribute __ ((section("ss"))定義自定義段,其開始地址為 & __ start_ss,結束地址為 & __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標志段ss的起止地址extern size_t __start_ss;extern size_t __stop_ss; typedef struct { void (*p)(int, int);} node_t; // 結構體變量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,執行node_t結構中的p指向的函數 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 */

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

    關注

    180

    文章

    7614

    瀏覽量

    137720
  • 函數
    +關注

    關注

    3

    文章

    4346

    瀏覽量

    62973
  • 編譯器
    +關注

    關注

    1

    文章

    1642

    瀏覽量

    49286

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

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

收藏 人收藏

    評論

    相關推薦

    C語言如何處理函數的返回值

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

    EE-128:C語言中的DSP:從C調用匯編類成員函數

    電子發燒友網站提供《EE-128:C語言中的DSP:從C調用匯編類成員函數.pdf》資料免費下載
    發表于 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>調用匯編類成員<b class='flag-5'>函數</b>

    同樣是函數,在CC++中有什么區別

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

    使用C語言實現函數模

      用C語言能不能實現一個通用的函數,既能完成整數的相加,又能完成浮點數的相加?
    的頭像 發表于 11-09 11:38 ?478次閱讀

    C語言中的socket編程基礎

    數據 步驟6:關閉socket 創建socket 在C語言中,創建socket需要使用socket()函數。這個函數需要兩個參數:域
    的頭像 發表于 11-01 16:51 ?469次閱讀

    請問ESP32C3 I2S驅動支持回調函數獲取數據嗎?

    目前I2S驅動只看到i2s_read接口獲取數據,但這是polling方式的。是否有注冊回調函數,當數據到達是調用回函數通知上層app?
    發表于 06-28 06:11

    為什么無法停止使用cy_wcm_connect 的rtos定時器回調函數

    。 由于 cy_wcm_connect() 函數的某些原因,計時器無法停止。 取而代之的是調用回調函數,由于設備已連接到 Wifi,它將再次嘗試停止計時器。 我想知道如何以正確的方式停
    發表于 05-24 06:34

    CAPL腳本使用介紹

    CAPL中也有類似于C語言中的回調函數的機制,如檢測報文周期和錯誤幀的函數中就可以使用,當周期超界或者總線出現錯誤幀就會自動調
    的頭像 發表于 04-01 11:23 ?2404次閱讀

    C語言內存泄漏問題原理

    內存泄漏問題只有在使用堆內存的時候才會出現,棧內存不存在內存泄漏問題,因為棧內存會自動分配和釋放。C語言代碼中堆內存的申請函數是malloc。
    發表于 03-19 11:38 ?574次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>內存泄漏問題原理

    調函數(callback)是什么?回調函數的實現方法

    調函數是一種特殊的函數,它作為參數傳遞給另一個函數,并在被調用函數執行完畢后被調用。回調
    發表于 03-12 11:46 ?3143次閱讀

    淺談C語言中的函數定義

    如果函數要使用參數,則必須聲明接受參數值的變量。這些變量稱為函數的形式參數。 形式參數就像函數內的其他局部變量,在進入函數時被創建,退出函數
    發表于 03-11 10:09 ?444次閱讀

    函數指針與回調函數的應用實例

    通常我們說的指針變量是指向一個整型、字符型或數組等變量,而函數指針是指向函數函數指針可以像一般函數一樣,用于調用函數、傳遞參數。
    的頭像 發表于 03-07 11:13 ?437次閱讀
    <b class='flag-5'>函數</b>指針與回<b class='flag-5'>調</b><b class='flag-5'>函數</b>的應用實例

    ??嵌入式中回調函數的實現方法

    調函數的命名規范沒有固定的標準,但是根據通用慣例和編碼規范,回調函數的命名應該能夠反映函數的作用和功能,讓其他開發者能夠快速理解并使用。
    發表于 03-04 14:49 ?813次閱讀

    C語言中的可變參數介紹

    C 語言為這種情況提供了一個解決方案,它允許您定義一個函數,能根據具體的需求接受可變數量的參數
    發表于 02-28 14:00 ?356次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>中的可變參數介紹

    C語言中的動態內存管理講解

    本章將講解 C 中的動態內存管理。C 語言為內存的分配和管理提供了幾個函數。這些函數可以在 頭文件中找到。
    的頭像 發表于 02-23 14:03 ?435次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>中的動態內存管理講解
    主站蜘蛛池模板: 欧美成人免费网站 | 国模私拍一区二区三区 | 男人和女人做爽爽视频在线观看 | 亚洲精品九色在线网站 | 亚洲一区有码 | 亚洲网站免费观看 | 天天干天天操天天 | 欧美激情综合色综合啪啪五月 | 亚洲第一精品夜夜躁人人爽 | 日韩卡1卡2卡三卡四卡二卡免 | 97影院理论| 一区二区三区免费精品视频 | 免费一级毛片在线播放不收费 | 波多野结衣第一页 | 欧美一级做一a做片性视频 欧美一级做一级做片性十三 | 欧美亚洲视频一区 | 天堂网www在线资源中文 | 日本一区免费观看 | 国产精品美女久久久 | 欧美精品二区 | 五月亭亭六月丁香 | 操美女的视频网站 | 性夜影院爽黄a免费视频 | 日本成人一级片 | 欧美色视频日本片免费高清 | 看毛片网 | 天天弄天天模 | 你懂得在线网址 | 丁香婷婷久久大综合 | 一级特黄aa毛片免费观看 | 又粗又大又猛又爽免费视频 | 男女做视频网站免费观看 | 欧美一区二区三区免费看 | 视频一区中文字幕 | 亚洲网站一区 | 国产高清美女一级a毛片 | 在线免费看黄 | 久久国产精品免费网站 | 欧美日韩国产成人精品 | 亚洲a视频| 激情文学综合丁香 |