色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

    文章

    7604

    瀏覽量

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

    關(guān)注

    3

    文章

    4327

    瀏覽量

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

    關(guān)注

    1

    文章

    1623

    瀏覽量

    49108

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

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

收藏 人收藏

    評論

    相關(guān)推薦

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

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

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

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

    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 ?302次閱讀

    請問ESP32C3 I2S驅(qū)動支持回調(diào)函數(shù)獲取數(shù)據(jù)嗎?

    目前I2S驅(qū)動只看到i2s_read接口獲取數(shù)據(jù),但這是polling方式的。是否有注冊回調(diào)函數(shù),當(dāng)數(shù)據(jù)到達是調(diào)用回函數(shù)通知上層app?
    發(fā)表于 06-28 06:11

    為什么無法停止使用cy_wcm_connect 的rtos定時器回調(diào)函數(shù)?

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

    CAPL腳本使用介紹

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

    C語言內(nèi)存泄漏問題原理

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

    調(diào)函數(shù)(callback)是什么?回調(diào)函數(shù)的實現(xiàn)方法

    調(diào)函數(shù)是一種特殊的函數(shù),它作為參數(shù)傳遞給另一個函數(shù),并在被調(diào)用函數(shù)執(zhí)行完畢后被調(diào)用?;?b class='flag-5'>調(diào)
    發(fā)表于 03-12 11:46 ?2903次閱讀

    淺談C語言中的函數(shù)定義

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

    函數(shù)指針與回調(diào)函數(shù)的應(yīng)用實例

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

    ??嵌入式中回調(diào)函數(shù)的實現(xiàn)方法

    調(diào)函數(shù)的命名規(guī)范沒有固定的標(biāo)準(zhǔn),但是根據(jù)通用慣例和編碼規(guī)范,回調(diào)函數(shù)的命名應(yīng)該能夠反映函數(shù)的作用和功能,讓其他開發(fā)者能夠快速理解并使用。
    發(fā)表于 03-04 14:49 ?711次閱讀

    C語言中的可變參數(shù)介紹

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

    C語言中的動態(tài)內(nèi)存管理講解

    本章將講解 C 中的動態(tài)內(nèi)存管理。C 語言為內(nèi)存的分配和管理提供了幾個函數(shù)。這些函數(shù)可以在 頭文件中找到。
    的頭像 發(fā)表于 02-23 14:03 ?390次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>中的動態(tài)內(nèi)存管理講解

    c語言,c++,java,python區(qū)別

    C語言、C++、Java和Python是四種常見的編程語言,各有優(yōu)點和特點。 C語言
    的頭像 發(fā)表于 02-05 14:11 ?2366次閱讀

    如何解決C語言中的“訪問權(quán)限沖突”異常?C語言引發(fā)異常原因分析

    如何解決C語言中的“訪問權(quán)限沖突”異常?C語言引發(fā)異常原因分析? 在C語言中,訪問權(quán)限沖突異常通
    的頭像 發(fā)表于 01-12 16:03 ?5632次閱讀
    主站蜘蛛池模板: 国偷自产AV一区二区三区健身房| 色哟哟tv| 黑人强伦姧人妻日韩那庞大的| 18禁国产精品久久久久久麻豆| 日本综艺大尺度无删减版在线 | 无码国产成人777爽死在线观看| 国产一区二区精品视频| 99热这里只有精品视频2| 亚洲va在线va天堂XX xX| 奇虎成人网| 久久99视热频国只有精品| 抽插H浊水H嫩B父皇| 在线 国产 欧美 亚洲 天堂 | 亚洲黄色在线| 日韩人妻无码精品久久中文字幕| 久久视热频国产这里只有精品23 | 这里只有精品在线视频| 亚洲狠狠97婷婷综合久久久久| 久久在精品线影院精品国产| 广播电台在线收听| 做暖免费观看日本| 亚洲精品色婷婷在线蜜芽| 日本邪恶少女漫画大全| 美女脱18以下禁止看免费| 国产一区二区青青精品久久| MELODY在线播放无删减| 在线观看亚洲免费视频| 亚洲成 人a影院青久在线观看| 日韩人妻双飞无码精品久久| 暖暖视频免费高清在线观看 视频 暖暖视频大全免费观看 | 成人无码精品一区二区在线观看| 在野外被男人躁了一夜动图| 秀婷程仪公欲息肉婷在线观看| 日韩 国产 欧美视频二区| 嗯啊好爽视频| 理论片87福利理论电影| 久久99精品AV99果冻传媒| 后式大肥臀国产在线| 国产嫩草在线观看| 国产精品成人A蜜柚在线观看| 抽插妇女疯狂视频|