女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

c語言枚舉end是做什么用的?

GReq_mcu168 ? 來源:硬件攻城獅 ? 作者:硬件攻城獅 ? 2022-04-26 15:36 ? 次閱讀
我在知乎上看到這個問題,一開始,也有一些疑惑,后面查了一些資料,對于這個問題,簡單的說一下我的看法。ab3f6f9e-c3b9-11ec-bce3-dac502259ad0.png

枚舉有多大

枚舉類型到底有多大,占多少空間呢?這個要具體情況具體分析,編譯器會視情況而定。

下面是我測試用的編譯器版本。

gcc(Ubuntu7.5.0-3ubuntu1~18.04)7.5.0
Copyright(C)2017FreeSoftwareFoundation,Inc.
Thisisfreesoftware;seethesourceforcopyingconditions.ThereisNO
warranty;notevenforMERCHANTABILITYorFITNESSFORAPARTICULARPURPOSE.

當我寫下這段代碼的時候,實際的輸出會是多少呢

ab4e543c-c3b9-11ec-bce3-dac502259ad0.png

有人會說是 1,有人會說是 4,我最終運行的確實是4

ab5c14aa-c3b9-11ec-bce3-dac502259ad0.png輸出結果

但是這個結果并不是唯一的,它取決于你的編譯器,另外還取決于編譯器參數,gcc這里有個編譯器參數 -fshort-enums,如果我們在編譯的時候加上這個,那么編譯出來是什么呢?

ab6814f8-c3b9-11ec-bce3-dac502259ad0.png短枚舉的輸出結果

最終結果變成了1

現在我在原先的代碼中,加入CMD_MAX_16BIT = 0xFFFF,下面看看輸出結果是多少。

ab7345ee-c3b9-11ec-bce3-dac502259ad0.png增帶值范圍

運行輸出結果如下:

ab8022a0-c3b9-11ec-bce3-dac502259ad0.png輸出結果

是的,它變成了2。因此我們可以得出結論就是:

編譯器將為枚舉分配足夠的內存大小,來保存我們所聲明的任何值。所以,如果我們的代碼中只使用低于 256(8位的范圍是0~255) 的值,我們的枚舉應該是 8 位寬,也就是一個字節,而后面的0xFFFF顯然是16位,兩個字節,所以最終輸出為2

為此我參考了一下gcc user manual,如下;

https ://gcc.gnu.org/onlinedocs/gcc/Code-Gen-Options.html

-fshort-enums

Allocate to an enum type only as many bytes as it needs for the declared range of possible values. Specifically, the enum type is equivalent to the smallest integer type that has enough room.

Warning: the -fshort-enums switch causes GCC to generate code that is not binary compatible with code generated without that switch. Use it to conform to a non-default application binary interface.

所以,我們需要明確的是編譯器是否會默認執行 -fshort-enums這個命令,大多數是不會的,這里我還測試了一些clang,具體結果和gcc相同。

但是在嵌入式編程中需要注意,這里我查了一下,IAR的編譯器默認會執行 -fshort-enums

電腦上沒有IAR,這里我參考了IAR 的 ARM C 編譯器的文檔IAR C/C++ Development Guide

ab8c73d4-c3b9-11ec-bce3-dac502259ad0.png

可以看到enum類型默認的規定,如果要強制為int類型的話,需要編譯的時候提那就--enum_is_int的編譯參數,如下所示;

ab993178-c3b9-11ec-bce3-dac502259ad0.png枚舉類型aba6d9d6-c3b9-11ec-bce3-dac502259ad0.png

所以這里為了避免編譯器的優化,以及不同的硬件平臺和不同編譯器,從而導致枚舉分配內存空間的變化,所以上述增加了一個0xFFFFFFFF,強制編譯器為枚舉分配4個字節的空間。

abb5b62c-c3b9-11ec-bce3-dac502259ad0.png設置最大范圍為4字節

最終的輸出結果都是4,如下圖所示;

abd0b224-c3b9-11ec-bce3-dac502259ad0.png輸出結果比較

看來雖然是一個很小的知識點,但是這中間的坑還真不少,好了,本期的文章就到這里了,我們下期再見。

審核編輯 :李倩


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • C語言
    +關注

    關注

    180

    文章

    7630

    瀏覽量

    140164
  • 編譯器
    +關注

    關注

    1

    文章

    1654

    瀏覽量

    49849

原文標題:難倒高手了,c語言枚舉end的作用是什么?

文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    在Deepseek AI眼中,配電室是做什么用的?

    DEEPSEEK眼中的配電室什么樣?嗯,用戶問配電室是做什么用的,我需要先理解配電室的基本功能。配電室聽起來像是和電力分配有關的地方,對吧?可能和電力系統有關,比如建筑物或者工廠里的電力分配。首先,我應該明確配電室的主要作用是什么。
    的頭像 發表于 03-05 09:38 ?247次閱讀

    AI開源模型庫有什么用

    AI開源模型庫作為推動AI技術發展的重要力量,正深刻改變著我們的生產生活方式。接下來,AI部落小編帶您了解AI開源模型庫有什么用
    的頭像 發表于 02-24 11:50 ?302次閱讀

    AI項目管理平臺有什么用

    當今,AI項目的復雜性和多變性給項目管理帶來了前所未有的挑戰。為了有效應對這些挑戰,AI項目管理平臺應運而生。那么,AI項目管理平臺有什么用?下面,AI部落小編帶您了解。
    的頭像 發表于 02-19 11:16 ?286次閱讀

    請問ADS1282中SYNC是做什么用的,和讀寫程序有關系嗎?

    請問ADS1282中SYNC是做什么用的,和讀寫程序有關系嗎?我現在只是給接到了上拉3.3V電阻,不知道這是否和我的程序不一直讀0有關系?
    發表于 02-08 09:16

    EE-33:C語言對ADSP-21xx定時器進行編程

    電子發燒友網站提供《EE-33:C語言對ADSP-21xx定時器進行編程.pdf》資料免費下載
    發表于 01-15 15:46 ?0次下載
    EE-33:<b class='flag-5'>用</b><b class='flag-5'>C</b><b class='flag-5'>語言</b>對ADSP-21xx定時器進行編程

    dac7624 data output timing是做什么用的?

    1:請問左側的 data output timing 是做什么用的?右側的是寫數字輸入的時序吧。2:這款dac可以單純的IO模擬時序通信吧3:這個t CSD 要求最大不能超過160ns 很多單片機都達不到吧。單純的翻轉下IO,實際
    發表于 01-01 07:52

    使用C語言實現函數模板

      C語言能不能實現一個通用的函數,既能完成整數的相加,又能完成浮點數的相加?
    的頭像 發表于 11-09 11:38 ?834次閱讀

    C語言與Java語言的對比

    C語言和Java語言都是當前編程領域中的重要成員,它們各自具有獨特的優勢和特點,適用于不同的應用場景。以下將從語法特性、內存管理、跨平臺性、性能、應用領域等多個方面對C
    的頭像 發表于 10-29 17:31 ?916次閱讀

    TAS5611a的13腳14腳的晶振是做什么用的?

    最近要做一個項目,D類功放立體聲輸出,接8歐負載時要求功率要50W以上,查看TI芯片資料TAS5611A比較適合,但是我看到資料上面第13腳,14腳有個晶振的接口,請問這個晶振是做什么用的,需要多少MHZ比較合適?
    發表于 10-29 07:18

    請問TLV320AIC3204中Processing Block是做什么用的啊?

    TLV320AIC3204中Processing Block 是做什么用的啊?
    發表于 10-24 08:24

    TAP3118和TPA3116開發板所處位置的電路是做什么用的?

    如圖的TAP3118和TPA3116開發板所處位置的電路是做什么用的,為什么在芯片PDF里面這里這個電路卻沒有,而是在電感輸出那里加了一個1nF對地,這兩種方式有什么不一樣
    發表于 10-12 08:23

    使用TM4C129x 微控制器為 TMP1826實現單線枚舉功能應用說明

    電子發燒友網站提供《使用TM4C129x 微控制器為 TMP1826實現單線枚舉功能應用說明.pdf》資料免費下載
    發表于 09-12 11:10 ?0次下載
    使用TM4<b class='flag-5'>C</b>129x 微控制器為 TMP1826實現單線<b class='flag-5'>枚舉</b>功能應用說明

    BOOSTXL_BUCKCONV評估板上的高邊電流采樣電路,請問C10-C14都是做什么用的呢?

    這是ti的BOOSTXL_BUCKCONV評估板上的高邊電流采樣電路,請問C10-C14都是做什么用的呢?是用來補償相位嗎?如果不是的話是做什么用的呢?這些電容值怎么計算呢
    發表于 09-06 06:29

    PLC編程語言C語言的區別

    在工業自動化和計算機編程領域中,PLC(可編程邏輯控制器)編程語言C語言各自扮演著重要的角色。盡管兩者都是編程語言,但它們在多個方面存在顯著的區別。本文將從多個維度深入探討PLC編程
    的頭像 發表于 06-14 17:11 ?4339次閱讀

    請問AT+MLWULDATAEX命令有什么用

    AT+MLWULDATAEX 命令有什么用
    發表于 06-04 06:16