91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

完善資料讓更多小伙伴認(rèn)識你,還能領(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ù)地址,以達(dá)到委托其他函數(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)簡單模擬反射

高級語言的反射機(jī)制,簡單來說,就是可以通過字符串型獲取對應(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ù)組添加成員的動(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 #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); } // 編譯器會自動(dòng)提供__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)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • C語言
    +關(guān)注

    關(guān)注

    183

    文章

    7644

    瀏覽量

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

    關(guān)注

    3

    文章

    4417

    瀏覽量

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

    關(guān)注

    1

    文章

    1672

    瀏覽量

    51580

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

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

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

掃碼添加小助手

加入工程師交流群

    評論

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

    函數(shù)指針與回調(diào)函數(shù)解讀

    函數(shù)指針是指向函數(shù)的指針變量。通過函數(shù)指針C語言可以實(shí)現(xiàn)各種強(qiáng)大的功能與設(shè)計(jì)方法。而回調(diào)
    發(fā)表于 01-19 07:34

    C語言函數(shù)指針的六個(gè)高級的應(yīng)用場景

    調(diào)用的函數(shù)。通常,回調(diào)函數(shù)是在某個(gè)庫函數(shù)或框架函數(shù)中注冊的,當(dāng)某個(gè)條件滿足時(shí),庫函數(shù)或框架
    發(fā)表于 01-04 12:25

    C語言調(diào)函數(shù)原來這么簡單

    了解開發(fā)語言的朋友應(yīng)該都會對回調(diào)函數(shù)有所了解,在很多的程序開發(fā)語言中都能看到回調(diào)的身影。很多場景下,當(dāng)某個(gè)條件成立以后我們**代碼執(zhí)行某些指
    發(fā)表于 12-30 06:45

    如何用好 C 語言函數(shù)的返回值?

    基本上,沒有人會將大段的C語言代碼全部塞入 main() 函數(shù)。更好的做法是按照復(fù)用率高、耦合性低的原則,盡可能的將代碼拆分不同的功能模塊,并封裝成函數(shù)
    發(fā)表于 12-25 07:17

    調(diào)函數(shù)例子的應(yīng)用

    ;p_sub)(1.3, 2.2), (op->p_mul)(1.3, 2.2), (*op->p_div)(1.3, 2.2)); /* 調(diào)用回調(diào)函數(shù)
    發(fā)表于 12-11 07:23

    怎么使用回調(diào)函數(shù)

    : b = %d \", b); return 0; } int Callback_3(int c)///< 回調(diào)函數(shù)3 { printf(\"Hello
    發(fā)表于 12-11 06:22

    大彩講堂:VisualHMI-LUA教程-on_screen_change回調(diào)函數(shù)使用指南

    on_screen_change回調(diào)函數(shù)使用指南
    的頭像 發(fā)表于 08-31 16:32 ?923次閱讀
    大彩講堂:VisualHMI-LUA教程-on_screen_change回<b class='flag-5'>調(diào)</b><b class='flag-5'>函數(shù)</b>使用指南

    大彩講堂:VisualHMI-LUA教程-on_update回調(diào)函數(shù)使用指南

    調(diào)函數(shù)使用指南
    的頭像 發(fā)表于 08-31 16:25 ?869次閱讀
    大彩講堂:VisualHMI-LUA教程-on_update回<b class='flag-5'>調(diào)</b><b class='flag-5'>函數(shù)</b>使用指南

    C語言中的內(nèi)聯(lián)函數(shù)與宏

    C編程中,內(nèi)聯(lián)函數(shù)和宏都用于避免函數(shù)調(diào)用的開銷并編寫可復(fù)用的邏輯部分,但它們在工作方式和安全性方面存在顯著差異。
    的頭像 發(fā)表于 07-25 15:10 ?1900次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>中的內(nèi)聯(lián)<b class='flag-5'>函數(shù)</b>與宏

    大彩講堂:VisualHMI-LUA教程-on_press回調(diào)函數(shù)使用指南

    一、適合范圍本文檔適用于VisualHMI平臺,Lua腳本語言為V5.3版本,配合工程可以完成大部分的內(nèi)部邏輯處理。二、概述on_press(state,x,y)觸摸回調(diào)函數(shù),當(dāng)帶觸摸的串口屏,點(diǎn)擊
    的頭像 發(fā)表于 07-23 16:32 ?1199次閱讀
    大彩講堂:VisualHMI-LUA教程-on_press回<b class='flag-5'>調(diào)</b><b class='flag-5'>函數(shù)</b>使用指南

    大彩講堂:VisualHMI-LUA教程-on_run回調(diào)函數(shù)使用指南

    一、適合范圍本文檔適用于VisualHMI平臺,Lua腳本語言為V5.3版本,配合工程可以完成大部分的內(nèi)部邏輯處理。二、概述on_run(screen)周期回調(diào)函數(shù),用該回調(diào)
    的頭像 發(fā)表于 07-23 15:25 ?1130次閱讀
    大彩講堂:VisualHMI-LUA教程-on_run回<b class='flag-5'>調(diào)</b><b class='flag-5'>函數(shù)</b>使用指南

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

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

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

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

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

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

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

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