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

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

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

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

有什么辦法可以做到私有結(jié)構(gòu)體成員與公共結(jié)構(gòu)體成員區(qū)別對(duì)待呢?

冬至配餃子 ? 來源:最后一個(gè)bug ? 作者:bug菌 ? 2022-08-11 14:42 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

在文章最后提到之前的隱藏結(jié)構(gòu)體成員的方法是一種完全私有的封裝無法做到"公私分明",這樣通過函數(shù)調(diào)用在MCU中會(huì)存在較大的開銷。

1、原理與技巧

那時(shí)候bug菌就在想有什么辦法可以做到私有成員與公共成員區(qū)別對(duì)待呢?

既然.h文件中的不完全類型僅僅只是一個(gè)啥也不含的結(jié)構(gòu)體空殼,那么根據(jù)結(jié)構(gòu)體的內(nèi)存模型以及我們平時(shí)經(jīng)常提到的C語言面向?qū)ο笤O(shè)計(jì)中的繼承處理。

于是便編寫了如下代碼來驗(yàn)證我的想法:

參考代碼:

poYBAGL0o9aAbQLGAAD9hCfZ5sI916.pngpoYBAGL0o92AOVYBAAB0SK8WK5A993.pngpYYBAGL0o_WASNMLAACXtOsYS8w370.png

輸出結(jié)果:

poYBAGL0o_yAJFQoAABWl3kCgcw166.png

從輸出結(jié)果上來看編譯正常,且輸出了正確的結(jié)果,member1可被外界直接訪問,而member2只能通過App.c內(nèi)部直接訪問,或者通過定義外部函數(shù)接口進(jìn)行間接訪問,否則就會(huì)報(bào)錯(cuò)。一頓猛如虎的操作竟然驗(yàn)證了自己的一些想法。

2、優(yōu)化版本

后來又想了想,如果成員比較多,不是特別好管理,于是嘗試了一個(gè)更好的成員管理方式:

參考代碼:

pYYBAGL0pDCALpEpAAC8H4wIN5o435.pngpoYBAGL0pDWARE0QAAD8jASol1E098.pngpoYBAGL0pDyAW16gAACq0UJ90uU981.pngpYYBAGL0pEOAAkJZAAD-dlmim7M607.png

輸出結(jié)果:

pYYBAGL0pFyAT6D8AABXBO7RPHI405.png

編譯OK,完工,是不是感覺有一股C++的味道了,如果你還沒有看懂的話,記得多看幾遍,因?yàn)檫@種處理方式算是非常常見的~



審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    147

    文章

    18925

    瀏覽量

    398276
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    9521

    瀏覽量

    157048
  • C語言
    +關(guān)注

    關(guān)注

    183

    文章

    7644

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    鴻蒙智能上/下架、升級(jí)流程介紹

    執(zhí)行上架操作,并且已經(jīng)審核通過的智能,才能被其他用戶搜索并使用。 升級(jí)審核未通過的智能,線上依舊保留上一次通過審核的智能版本提供給其他用戶使用。 下架后的智能,用戶無法再使用。
    發(fā)表于 02-10 10:38

    請(qǐng)問如何從一個(gè)函數(shù)內(nèi)部判斷本函數(shù)是否是個(gè)成員函數(shù)還是個(gè)非成員函數(shù)?

    如何從一個(gè)函數(shù)內(nèi)部判斷本函數(shù)是否是個(gè)成員函數(shù)還是個(gè)非成員函數(shù)?
    發(fā)表于 01-06 06:30

    10個(gè)例子代碼,C語言結(jié)構(gòu)的高級(jí)

    當(dāng)涉及到C語言結(jié)構(gòu)的高級(jí)**時(shí),很多有趣和強(qiáng)大的技巧可以應(yīng)用。下面是10個(gè)例子代碼,每個(gè)例子都使用了不同的高級(jí)結(jié)構(gòu)
    發(fā)表于 01-05 06:32

    一個(gè)經(jīng)典的結(jié)構(gòu)和聯(lián)合體共用的實(shí)例

    Linux 中可以 使用 sizeof 進(jìn)行獲取,默認(rèn)為字節(jié)對(duì)齊的大小。 聯(lián)合體 聯(lián)合體的參數(shù)共享同一個(gè)內(nèi)存地址,所占的內(nèi)存大小完全是由聯(lián)合體中參數(shù)類型決定字長(zhǎng),然后數(shù)據(jù)共享,內(nèi)存共享等。 結(jié)構(gòu)和聯(lián)合體
    發(fā)表于 12-16 07:14

    結(jié)構(gòu)聲明與定義

    1、聲明 結(jié)構(gòu)的聲明使用struct關(guān)鍵字,如果我們想要把我們的學(xué)籍信息組織一下的話,可以這樣表示: struct Info { unsigned long identifier;//學(xué)號(hào)
    發(fā)表于 12-11 07:52

    typedef結(jié)構(gòu)使用

    雖然結(jié)構(gòu)的出現(xiàn)能夠讓我們一個(gè)更科學(xué)的數(shù)據(jù)結(jié)構(gòu)來管理數(shù)據(jù),但是每次使用結(jié)構(gòu)都需要struct
    發(fā)表于 12-08 07:04

    共用聲明

    共用也稱聯(lián)合體。 和結(jié)構(gòu)還是有點(diǎn)像: union 共用名稱 { 成員1; 成員2
    發(fā)表于 12-05 07:24

    為什么不建議用匿名結(jié)構(gòu)

    : invalid use of ‘struct data_def::::value_bit’ 可能有方法可以設(shè)置 gcc 編譯支持匿名結(jié)構(gòu),但是魚鷹也不想深究,改了就是。 因此
    發(fā)表于 12-04 07:39

    C語言的編程技巧

    1、宏定義使用do{...}while(0)?:當(dāng)宏定義中包含多條語句時(shí),使用do{...}while(0)可以避免語句嵌套問題,確保宏的獨(dú)立性。? ?2、靈活數(shù)組成員?:C99標(biāo)準(zhǔn)允許結(jié)構(gòu)
    發(fā)表于 11-27 06:46

    C語言結(jié)構(gòu)使用

    有時(shí)候需要將不同類型的數(shù)據(jù)組合為一個(gè)整體,以便于引用。例如,一名學(xué)生學(xué)號(hào)、姓名、性別、年齡等屬性,如果針對(duì)每個(gè)屬性都單獨(dú)定義一個(gè)變量,那么當(dāng)多名學(xué)生時(shí)變量就難以分清。結(jié)構(gòu)就是用來
    發(fā)表于 11-12 08:30

    can_sample例程,rxmsg.hdr = -1;語句報(bào)錯(cuò)如何解決?

    使用官方CAN_sample例程編譯,cubemx已經(jīng)配置好CAN引腳,menuconfig也已經(jīng)打開相關(guān)接口,但編譯時(shí)報(bào)錯(cuò),顯示結(jié)構(gòu) rt_can_msg結(jié)構(gòu)中沒有hdr這個(gè)
    發(fā)表于 09-24 07:05

    定義IO初始化結(jié)構(gòu)

    由上述IOPORT相關(guān)功能的枚舉類型我們可以知道,在對(duì)IOPORT模塊進(jìn)行初始化時(shí)需要根據(jù)情況配置它們。因此我們定義一個(gè)IOPORT初始化的結(jié)構(gòu)類型IOPORT_Init_t,它的成員
    的頭像 發(fā)表于 07-16 16:26 ?1414次閱讀

    滲壓計(jì)在混凝土結(jié)構(gòu)中的安裝指南

    用于測(cè)量土體中的孔隙水壓力、巖和混凝土內(nèi)的滲透水壓力。在混凝土結(jié)構(gòu)中埋設(shè)滲壓計(jì),可以實(shí)時(shí)監(jiān)測(cè)結(jié)構(gòu)內(nèi)部的水壓力變化,為工程安全評(píng)估和維護(hù)提
    的頭像 發(fā)表于 05-28 10:55 ?602次閱讀
    滲壓計(jì)在混凝土<b class='flag-5'>結(jié)構(gòu)</b><b class='flag-5'>體</b>中的安裝指南

    GLAD應(yīng)用:全息光柵模擬

    用于模擬全息記錄介質(zhì)中形成的梯度折射率分布。全息結(jié)構(gòu)一旦形成,就可以在傳輸過程中將一束入射光波逐漸轉(zhuǎn)換成形成體全息結(jié)構(gòu)的另一束光波。兩束光波之間的能量傳遞轉(zhuǎn)換效率與
    發(fā)表于 05-15 09:32

    C語言中結(jié)構(gòu)與聯(lián)合體的深度解析:內(nèi)存布局與應(yīng)用場(chǎng)景

    一、基礎(chǔ)概念與核心差異 1.1 結(jié)構(gòu)(Struct)的本質(zhì) **結(jié)構(gòu)是C語言中實(shí)現(xiàn)數(shù)據(jù)封裝的基石,其核心特征在于內(nèi)存獨(dú)立性。每個(gè)成員變量
    發(fā)表于 04-08 09:18