在文章最后提到之前的隱藏結構體成員的方法是一種完全私有的封裝無法做到"公私分明",這樣通過函數調用在MCU中會存在較大的開銷。
1、原理與技巧
那時候bug菌就在想有什么辦法可以做到私有成員與公共成員區別對待呢?
既然.h文件中的不完全類型僅僅只是一個啥也不含的結構體空殼,那么根據結構體的內存模型以及我們平時經常提到的C語言面向對象設計中的繼承處理。
于是便編寫了如下代碼來驗證我的想法:
參考代碼:



輸出結果:

從輸出結果上來看編譯正常,且輸出了正確的結果,member1可被外界直接訪問,而member2只能通過App.c內部直接訪問,或者通過定義外部函數接口進行間接訪問,否則就會報錯。一頓猛如虎的操作竟然驗證了自己的一些想法。
2、優化版本
后來又想了想,如果成員比較多,不是特別好管理,于是嘗試了一個更好的成員管理方式:
參考代碼:




輸出結果:

編譯OK,完工,是不是感覺有一股C++的味道了,如果你還沒有看懂的話,記得多看幾遍,因為這種處理方式算是非常常見的~
審核編輯:劉清
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
mcu
+關注
關注
147文章
18925瀏覽量
398214 -
接口
+關注
關注
33文章
9521瀏覽量
157036 -
C語言
+關注
關注
183文章
7644瀏覽量
145599
發布評論請先 登錄
相關推薦
熱點推薦
鴻蒙智能體上/下架、升級流程介紹
執行上架操作,并且已經審核通過的智能體,才能被其他用戶搜索并使用。
升級審核未通過的智能體,線上依舊保留上一次通過審核的智能體版本提供給其他用戶使用。
下架后的智能體,用戶無法再使用。
發表于 02-10 10:38
一個經典的結構體和聯合體共用的實例
Linux 中可以 使用 sizeof 進行獲取,默認為字節對齊的大小。
聯合體
聯合體的參數共享同一個內存地址,所占的內存大小完全是由聯合體中參數類型決定字長,然后數據共享,內存共享等。
結構體和聯合體
發表于 12-16 07:14
結構體聲明與定義
1、聲明
結構體的聲明使用struct關鍵字,如果我們想要把我們的學籍信息組織一下的話,可以這樣表示:
struct Info
{
unsigned long identifier;//學號
發表于 12-11 07:52
為什么不建議用匿名結構體
: invalid use of ‘struct data_def::::value_bit’
有可能有方法可以設置 gcc 編譯支持匿名結構體,但是魚鷹也不想深究,改了就是。
因此
發表于 12-04 07:39
C語言的編程技巧
1、宏定義使用do{...}while(0)?:當宏定義中包含多條語句時,使用do{...}while(0)可以避免語句嵌套問題,確保宏的獨立性。?
?2、靈活數組成員?:C99標準允許結構體
發表于 11-27 06:46
C語言結構體使用
有時候需要將不同類型的數據組合為一個整體,以便于引用。例如,一名學生有學號、姓名、性別、年齡等屬性,如果針對每個屬性都單獨定義一個變量,那么當有多名學生時變量就難以分清。結構體就是用來
發表于 11-12 08:30
can_sample例程,rxmsg.hdr = -1;語句報錯如何解決?
使用官方CAN_sample例程編譯,cubemx已經配置好CAN引腳,menuconfig也已經打開相關接口,但編譯時報錯,顯示結構體 rt_can_msg結構體中沒有hdr這個
發表于 09-24 07:05
定義IO初始化結構體
由上述IOPORT相關功能的枚舉類型我們可以知道,在對IOPORT模塊進行初始化時需要根據情況配置它們。因此我們定義一個IOPORT初始化的結構體類型IOPORT_Init_t,它的成員
GLAD應用:體全息光柵模擬
用于模擬全息記錄介質中形成的梯度折射率分布。體全息結構一旦形成,就可以在傳輸過程中將一束入射光波逐漸轉換成形成體全息結構的另一束光波。兩束光波之間的能量傳遞轉換效率與
發表于 05-15 09:32
C語言中結構體與聯合體的深度解析:內存布局與應用場景
一、基礎概念與核心差異
1.1 結構體(Struct)的本質
**結構體是C語言中實現數據封裝的基石,其核心特征在于內存獨立性。每個成員變量
發表于 04-08 09:18
有什么辦法可以做到私有結構體成員與公共結構體成員區別對待呢?
評論