函數(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
2 簡單模擬反射
(1)簡單模擬反射
高級語言的反射機制,簡單來說,就是可以通過字符串型獲取對應(yīng)的類或者函數(shù)。下面,用C來簡單模擬反射:
#include
(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
-
C語言
+關(guān)注
關(guān)注
180文章
7631瀏覽量
141139 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4379瀏覽量
64616 -
編譯器
+關(guān)注
關(guān)注
1文章
1659瀏覽量
50094
原文標(biāo)題:C語言使用回調(diào)函數(shù)模擬委托與反射
文章出處:【微信號:c-stm32,微信公眾號:STM32嵌入式開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
深入理解C語言:函數(shù)—編程中的“積木塊”藝術(shù)

為什么中斷回調(diào)函數(shù)中不能使用接收中斷開啟函數(shù)?
如何使用自定義設(shè)置回調(diào)函數(shù)?
為什么中斷回調(diào)函數(shù)中不能使用接收中斷開啟函數(shù)?
VirtualLab Fusion應(yīng)用:具有粗糙表面的回復(fù)反射器的反射
解鎖TSMaster fifo函數(shù):報文讀取的高效方法

C語言如何處理函數(shù)的返回值
EE-128:C語言中的DSP:從C調(diào)用匯編類成員函數(shù)

評論