在线观看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

    文章

    7628

    瀏覽量

    139669
  • 函數
    +關注

    關注

    3

    文章

    4365

    瀏覽量

    63847
  • 編譯器
    +關注

    關注

    1

    文章

    1652

    瀏覽量

    49729

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

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

收藏 人收藏

    評論

    相關推薦

    為什么中斷回調函數中不能使用接收中斷開啟函數

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

    為什么不需要給回調函數傳遞參數

    調函數C語言里面一個重要機制。
    的頭像 發表于 04-15 10:11 ?137次閱讀

    VirtualLab Fusion應用:具有粗糙表面的回復反射器的反射

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

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

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

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

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

    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>

    C語言筆試題

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

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

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

    使用C語言實現函數模

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

    C語言中的socket編程基礎

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

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

    反射內存卡在半實物模擬仿真中的應用
    的頭像 發表于 11-01 14:10 ?397次閱讀

    C語言與Java語言的對比

    C語言和Java語言都是當前編程領域中的重要成員,它們各自具有獨特的優勢和特點,適用于不同的應用場景。以下將從語法特性、內存管理、跨平臺性、性能、應用領域等多個方面對C
    的頭像 發表于 10-29 17:31 ?821次閱讀

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

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

    PLC編程語言C語言的區別

    在工業自動化和計算機編程領域中,PLC(可編程邏輯控制器)編程語言C語言各自扮演著重要的角色。盡管兩者都是編程語言,但它們在多個方面存在顯著的區別。本文將從多個維度深入探討PLC編程
    的頭像 發表于 06-14 17:11 ?4202次閱讀

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

    。 由于 cy_wcm_connect() 函數的某些原因,計時器無法停止。 取而代之的是調用回調函數,由于設備已連接到 Wifi,它將再次嘗試停止計時器。 我想知道如何以正確的方式停
    發表于 05-24 06:34
    主站蜘蛛池模板: 国产深夜福利在线观看网站 | 午夜一级在线 | 35pao强力| 欧美精品一区在线看 | 亚洲乱亚洲乱妇41p国产成人 | 97爱爱爱| 午夜久久久久久亚洲国产精品 | 国产精品单位女同事在线 | 欧美一级看片免费观看视频在线 | 一级看片免费视频 | 五月天免费在线播放 | 全免费一级毛片在线播放 | 日本x色视频 | 免费人成动漫在线播放r18 | www福利视频| 色多多在线观看 | 激情五月综合综合久久69 | 97se狠狠狠狠狼亚洲综合网 | 天堂国产 | 久青草国产手机视频免费观看 | 狠狠操狠狠插 | 久久亚洲精选 | 国产午夜精品久久久久免费视 | 老师在办公室被躁得舒服小说 | 国产做爰一区二区 | 伊人色综合久久天天爱 | 欧美午夜性春猛交bbb | 欧美人成一本免费观看视频 | 色5566| 欧美在线1| 久久精品美女久久 | 你懂的视频在线看 | 四虎影院观看视频在线观看 | 西西人体www303sw大胆高清 | 丁香婷婷成人 | 国产精品一区牛牛影视 | 免费网站黄成人影院 | 亚洲国产欧美在线人成aaa | 国产乱淫a∨片免费视频 | 美女扒开尿口给男人桶爽视频 | 国产一级一级片 |