chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C語(yǔ)言使用回調(diào)函數(shù)模擬委托與反射

STM32嵌入式開(kāi)發(fā) ? 來(lái)源:STM32嵌入式開(kāi)發(fā) ? 作者:STM32嵌入式開(kāi)發(fā) ? 2022-03-14 10:19 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

函數(shù)是C語(yǔ)言的核心概念。主調(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)用,專(zhuān)業(yè)術(shù)語(yǔ)稱(chēng)為回調(diào)(callback),通過(guò)函數(shù)指針參數(shù)調(diào)用的第三方函數(shù)稱(chēng)為回調(diào)函數(shù)。

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

1 簡(jiǎn)單模擬委托

//C語(yǔ)言簡(jiǎn)單模擬委托//需要用的指針函數(shù)。通過(guò)用指針函數(shù)作為地址接收函數(shù)地址,以達(dá)到委托其他函數(shù)實(shí)現(xiàn)某方法的目的。#include typedef void(* fun)(); //typedef 把void(*)()類(lèi)型重命名為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 簡(jiǎn)單模擬反射

(1)簡(jiǎn)單模擬反射

高級(jí)語(yǔ)言的反射機(jī)制,簡(jiǎn)單來(lái)說(shuō),就是可以通過(guò)字符串型獲取對(duì)應(yīng)的類(lèi)或者函數(shù)。下面,用C來(lái)簡(jiǎn)單模擬反射:

#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支持通過(guò)使用 __ attribute __ ((section())),將函數(shù)、變量放到指定的數(shù)據(jù)段中。也就是說(shuō),可以讓編譯器幫我們完成上例中向數(shù)組添加成員的動(dòng)作。

借助此機(jī)制,回調(diào)函數(shù)可以在任意文件聲明,不需要修改其他文件。自定義段的起始和結(jié)束地址,可以通過(guò)變量 __ start_SECTIONNAME 和 __ stop_SECTIONNAME得到例如通過(guò) __ attribute __ ((section("ss"))定義自定義段,其開(kāi)始地址為 & __ 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); } // 編譯器會(huì)自動(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)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    183

    文章

    7642

    瀏覽量

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

    關(guān)注

    3

    文章

    4405

    瀏覽量

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

    關(guān)注

    1

    文章

    1669

    瀏覽量

    51057

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

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

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

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

    詳解hal_entry入口函數(shù)

    當(dāng)使用RTOS時(shí),程序從main函數(shù)開(kāi)始進(jìn)行線(xiàn)程調(diào)度;當(dāng)沒(méi)有使用RTOS時(shí),C語(yǔ)言程序的入口函數(shù)main函數(shù)調(diào)用了hal_entry
    的頭像 發(fā)表于 07-25 15:34 ?1640次閱讀

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

    C編程中,內(nèi)聯(lián)函數(shù)和宏都用于避免函數(shù)調(diào)用的開(kāi)銷(xiāo)并編寫(xiě)可復(fù)用的邏輯部分,但它們?cè)诠ぷ鞣绞胶桶踩苑矫娲嬖陲@著差異。
    的頭像 發(fā)表于 07-25 15:10 ?1700次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>中的內(nèi)聯(lián)<b class='flag-5'>函數(shù)</b>與宏

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

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

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

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

    如何使用自定義設(shè)置回調(diào)函數(shù)

    你好,我正在嘗試編寫(xiě)自己的自定義設(shè)置回調(diào)函數(shù),并使用 fastEnum=false。 是否有任何代碼示例或資料可供我參考? void CyU3PUsbRegisterSetupCallback
    發(fā)表于 05-21 06:11

    為什么中斷回調(diào)函數(shù)中不能使用接收中斷開(kāi)啟函數(shù)

    我看(書(shū)是基于stm32f407編寫(xiě))書(shū)上說(shuō)在串口接收中斷回調(diào)函數(shù)里面不能使用 接收中斷開(kāi)啟函數(shù),書(shū)上是利用自己創(chuàng)建了空閑中斷回調(diào)函數(shù),在這
    發(fā)表于 04-22 08:19

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

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

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

    系統(tǒng)設(shè)置 當(dāng)試圖將獨(dú)立于入射方向的光大致反射回同一方向時(shí),通??梢允?b class='flag-5'>用回復(fù)反射器。 這個(gè)演示展示了如何在非序列場(chǎng)追跡的幫助下對(duì)這種結(jié)構(gòu)進(jìn)行建模。它還包括通過(guò)在表面上應(yīng)用隨機(jī)函數(shù)來(lái)對(duì)
    發(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 ?906次閱讀
    解鎖TSMaster fifo<b class='flag-5'>函數(shù)</b>:報(bào)文讀取的高效方法

    C語(yǔ)言如何處理函數(shù)的返回值

    的那樣,直接把 1234 賦值給了變量 ret? 搞懂這個(gè)問(wèn)題不難,只要看下匯編代碼就行。 把代碼編譯一下,只編譯不鏈接,得到的就是C對(duì)應(yīng)的匯編代碼。 這塊是 test 函數(shù),不用管上面這些代碼,如果一行一行去分析,沒(méi)有匯編基礎(chǔ)的話(huà)確實(shí)會(huì)頭疼。 看下這行代碼,很明顯,12
    的頭像 發(fā)表于 01-16 09:21 ?730次閱讀

    EE-128:C語(yǔ)言中的DSP:從C調(diào)用匯編類(lèi)成員函數(shù)

    電子發(fā)燒友網(wǎng)站提供《EE-128:C語(yǔ)言中的DSP:從C調(diào)用匯編類(lèi)成員函數(shù).pdf》資料免費(fèi)下載
    發(fā)表于 01-07 13:48 ?0次下載
    EE-128:<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>中的DSP:從<b class='flag-5'>C</b>調(diào)用匯編類(lèi)成員<b class='flag-5'>函數(shù)</b>

    C語(yǔ)言筆試題

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