国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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語言
    +關注

    關注

    183

    文章

    7644

    瀏覽量

    145570
  • 函數
    +關注

    關注

    3

    文章

    4417

    瀏覽量

    67501
  • 編譯器
    +關注

    關注

    1

    文章

    1672

    瀏覽量

    51595

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

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

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    函數指針與回調函數解讀

    函數指針是指向函數的指針變量。通過函數指針C語言可以實現各種強大的功能與設計方法。而回調
    發表于 01-19 07:34

    C語言函數指針的六個高級的應用場景

    調用的函數。通常,回調函數是在某個庫函數或框架函數中注冊的,當某個條件滿足時,庫函數或框架
    發表于 01-04 12:25

    C語言調函數原來這么簡單

    了解開發語言的朋友應該都會對回調函數有所了解,在很多的程序開發語言中都能看到回調的身影。很多場景下,當某個條件成立以后我們**代碼執行某些指
    發表于 12-30 06:45

    如何用好 C 語言函數的返回值?

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

    調函數例子的應用

    ;p_sub)(1.3, 2.2), (op->p_mul)(1.3, 2.2), (*op->p_div)(1.3, 2.2)); /* 調用回調函數
    發表于 12-11 07:23

    怎么使用回調函數

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

    大彩講堂:VisualHMI-LUA教程-on_screen_change回調函數使用指南

    on_screen_change回調函數使用指南
    的頭像 發表于 08-31 16:32 ?924次閱讀
    大彩講堂:VisualHMI-LUA教程-on_screen_change回<b class='flag-5'>調</b><b class='flag-5'>函數</b>使用指南

    大彩講堂:VisualHMI-LUA教程-on_update回調函數使用指南

    調函數使用指南
    的頭像 發表于 08-31 16:25 ?870次閱讀
    大彩講堂:VisualHMI-LUA教程-on_update回<b class='flag-5'>調</b><b class='flag-5'>函數</b>使用指南

    C語言中的內聯函數與宏

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

    大彩講堂:VisualHMI-LUA教程-on_press回調函數使用指南

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

    大彩講堂:VisualHMI-LUA教程-on_run回調函數使用指南

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

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

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

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

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

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

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

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

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