在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

    文章

    7616

    瀏覽量

    137979
  • 編譯器
    +關注

    關注

    1

    文章

    1642

    瀏覽量

    49333

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

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

收藏 人收藏

    評論

    相關推薦

    請問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 ?507次閱讀

    C語言與Java語言的對比

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

    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

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

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

    尾纖是做什么用

    尾纖是一種光纖連接器,也稱為裸光纖或豬尾線。它的一端裝有光纖活動連接器,另一端是光纜纖芯的斷頭,可以通過熔接技術與其他光纜纖芯相連。尾纖在光纖通信網絡中起到了關鍵的作用,主要用于連接不同的光纖設備,以實現光信號的傳輸和交換。 尾纖在各種光纖通信系統中都有廣泛的應用。例如,在大型數據中心中,尾纖用于連接服務器、交換機、路由器等設備,以實現數據的高速傳輸和交換。在企業局域網中,尾纖則用于連接終端設備(如計
    的頭像 發表于 04-30 10:28 ?1574次閱讀

    Linux是做什么用的?

    Linux是做什么用的?Linux是一種開源的操作系統,廣泛用于服務器、嵌入式設備和個人電腦等領域。它具有以下特點和用途: Linux是做什么用的? 1、服務器操作系統:Linux在服務器領域非常
    發表于 04-28 15:40

    fpga是c語言還是verilog

    FPGA(現場可編程邏輯門陣列)開發主要使用的編程語言是硬件描述語言(HDL),其中Verilog是最常用的編程語言之一。而C語言通常用于傳
    的頭像 發表于 03-27 14:38 ?2244次閱讀

    fpga的是什么編程語言 fpga什么語言開發

    fpga的是什么編程語言 FPGA(現場可編程邏輯門陣列)主要使用的編程語言是硬件描述語言(HDL)。在眾多的HDL中,Verilog HDL和VHDL是最常用的兩種。 Verilo
    的頭像 發表于 03-14 17:09 ?3680次閱讀

    fpga是做什么用

    FPGA(Field Programmable Gate Array),即現場可編程門陣列,是一種可編程邏輯芯片,其主要作用和功能體現在多個方面。
    的頭像 發表于 03-14 15:56 ?1540次閱讀

    治理焦油氨水分離槽滲漏為什么用SD2240材料

    電子發燒友網站提供《治理焦油氨水分離槽滲漏為什么用SD2240材料.docx》資料免費下載
    發表于 03-11 16:03 ?0次下載
    主站蜘蛛池模板: 六月婷婷导航福利在线 | 国产主播在线播放 | 快乐你懂的在线视频免费观看 | 亚洲黄色网址在线观看 | 成人影院免费观看 | 日本三级最新中文字幕电影 | 久久久久久久久久久观看 | 天天躁夜夜躁 | 亚洲性夜 | 国产免费人成在线视频视频 | 国产激爽大片在线播放 | aa黄色毛片 | 日日插天天操 | 污视频日本 | 天堂电影在线观看免费入口 | 美女黄页在线观看 | 四虎免费永久观看 | 天堂电影免费在线资源 | 天堂网在线www资源在线 | 第一福利在线 | 在线激情网址 | 中文字幕一区二区三区有限公司 | 激情五月婷婷丁香 | 丁香六月婷婷精品免费观看 | 天天狠天天干 | 亚洲怡红院在线观看 | 欧美+日本+国产+在线观看 | 亚洲黄色天堂 | 久久精品免费 | 亚洲乱码中文字幕综合 | 最好看最新的中文字幕1 | 久久网免费视频 | 人人做天天爱夜夜爽中字 | 好爽毛片一区二区三区四 | 免费视频不卡 | 酒色激情网 | 国产午夜精品理论片久久影视 | 六月天色婷婷 | 国产成人精品1024在线 | 俺去啦最新官网 | 欧美在线播放 |