一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

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

GReq_mcu168 ? 來源:硬件攻城獅 ? 作者:硬件攻城獅 ? 2022-04-26 15:36 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

我在知乎上看到這個(gè)問題,一開始,也有一些疑惑,后面查了一些資料,對(duì)于這個(gè)問題,簡(jiǎn)單的說一下我的看法。ab3f6f9e-c3b9-11ec-bce3-dac502259ad0.png

枚舉有多大

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

下面是我測(cè)試用的編譯器版本。

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

當(dāng)我寫下這段代碼的時(shí)候,實(shí)際的輸出會(huì)是多少呢?

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

有人會(huì)說是 1,有人會(huì)說是 4,我最終運(yùn)行的確實(shí)是4

ab5c14aa-c3b9-11ec-bce3-dac502259ad0.png輸出結(jié)果

但是這個(gè)結(jié)果并不是唯一的,它取決于你的編譯器,另外還取決于編譯器參數(shù),gcc這里有個(gè)編譯器參數(shù) -fshort-enums,如果我們?cè)诰幾g的時(shí)候加上這個(gè),那么編譯出來是什么呢?

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

最終結(jié)果變成了1

現(xiàn)在我在原先的代碼中,加入CMD_MAX_16BIT = 0xFFFF,下面看看輸出結(jié)果是多少。

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

運(yùn)行輸出結(jié)果如下:

ab8022a0-c3b9-11ec-bce3-dac502259ad0.png輸出結(jié)果

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

編譯器將為枚舉分配足夠的內(nèi)存大小,來保存我們所聲明的任何值。所以,如果我們的代碼中只使用低于 256(8位的范圍是0~255) 的值,我們的枚舉應(yīng)該是 8 位寬,也就是一個(gè)字節(jié),而后面的0xFFFF顯然是16位,兩個(gè)字節(jié),所以最終輸出為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.

所以,我們需要明確的是編譯器是否會(huì)默認(rèn)執(zhí)行 -fshort-enums這個(gè)命令,大多數(shù)是不會(huì)的,這里我還測(cè)試了一些clang,具體結(jié)果和gcc相同。

但是在嵌入式編程中需要注意,這里我查了一下,IAR的編譯器默認(rèn)會(huì)執(zhí)行 -fshort-enums 。

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

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

可以看到enum類型默認(rèn)的規(guī)定,如果要強(qiáng)制為int類型的話,需要編譯的時(shí)候提那就--enum_is_int的編譯參數(shù),如下所示;

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

所以這里為了避免編譯器的優(yōu)化,以及不同的硬件平臺(tái)和不同編譯器,從而導(dǎo)致枚舉分配內(nèi)存空間的變化,所以上述增加了一個(gè)0xFFFFFFFF,強(qiáng)制編譯器為枚舉分配4個(gè)字節(jié)的空間。

abb5b62c-c3b9-11ec-bce3-dac502259ad0.png設(shè)置最大范圍為4字節(jié)

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

abd0b224-c3b9-11ec-bce3-dac502259ad0.png輸出結(jié)果比較

看來雖然是一個(gè)很小的知識(shí)點(diǎ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)投訴
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7632

    瀏覽量

    141557
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1661

    瀏覽量

    50188

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

文章出處:【微信號(hào):mcu168,微信公眾號(hào):硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    交換機(jī)配置snmp有什么用?

    在復(fù)雜的網(wǎng)絡(luò)環(huán)境中,交換機(jī)作為核心設(shè)備之一,其穩(wěn)定性和性能直接影響整個(gè)網(wǎng)絡(luò)的運(yùn)行效率。而SNMP(簡(jiǎn)單網(wǎng)絡(luò)管理協(xié)議)作為網(wǎng)絡(luò)管理的標(biāo)準(zhǔn)協(xié)議,能夠幫助管理員高效監(jiān)控和管理交換機(jī),確保網(wǎng)絡(luò)的正常運(yùn)行。小編將在本文中詳細(xì)介紹交換機(jī)配置snmp有什么用。
    的頭像 發(fā)表于 03-19 10:26 ?417次閱讀

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

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

    AI開源模型庫有什么用

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

    AI項(xiàng)目管理平臺(tái)有什么用

    當(dāng)今,AI項(xiàng)目的復(fù)雜性和多變性給項(xiàng)目管理帶來了前所未有的挑戰(zhàn)。為了有效應(yīng)對(duì)這些挑戰(zhàn),AI項(xiàng)目管理平臺(tái)應(yīng)運(yùn)而生。那么,AI項(xiàng)目管理平臺(tái)有什么用?下面,AI部落小編帶您了解。
    的頭像 發(fā)表于 02-19 11:16 ?359次閱讀

    請(qǐng)問ADS1282中SYNC是做什么用的,和讀寫程序有關(guān)系嗎?

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

    EE-33:C語言對(duì)ADSP-21xx定時(shí)器進(jìn)行編程

    電子發(fā)燒友網(wǎng)站提供《EE-33:C語言對(duì)ADSP-21xx定時(shí)器進(jìn)行編程.pdf》資料免費(fèi)下載
    發(fā)表于 01-15 15:46 ?0次下載
    EE-33:<b class='flag-5'>用</b><b class='flag-5'>C</b><b class='flag-5'>語言</b>對(duì)ADSP-21xx定時(shí)器進(jìn)行編程

    dac7624 data output timing是做什么用的?

    1:請(qǐng)問左側(cè)的 data output timing 是做什么用的?右側(cè)的是寫數(shù)字輸入的時(shí)序吧。2:這款dac可以單純的IO模擬時(shí)序通信吧3:這個(gè)t CSD 要求最大不能超過160ns 很多單片機(jī)都達(dá)不到吧。單純的翻轉(zhuǎn)下IO,實(shí)際
    發(fā)表于 01-01 07:52

    使用C語言實(shí)現(xiàn)函數(shù)模板

      C語言能不能實(shí)現(xiàn)一個(gè)通用的函數(shù),既能完成整數(shù)的相加,又能完成浮點(diǎn)數(shù)的相加?
    的頭像 發(fā)表于 11-09 11:38 ?942次閱讀

    C語言與Java語言的對(duì)比

    C語言和Java語言都是當(dāng)前編程領(lǐng)域中的重要成員,它們各自具有獨(dú)特的優(yōu)勢(shì)和特點(diǎn),適用于不同的應(yīng)用場(chǎng)景。以下將從語法特性、內(nèi)存管理、跨平臺(tái)性、性能、應(yīng)用領(lǐng)域等多個(gè)方面對(duì)C
    的頭像 發(fā)表于 10-29 17:31 ?1060次閱讀

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

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

    C語言中最常見的宏定義寫法

    如果讓你C語言寫個(gè)宏定義,我相信大部分同學(xué)順手就能寫出define。
    的頭像 發(fā)表于 10-28 11:12 ?824次閱讀

    請(qǐng)問TLV320AIC3204中Processing Block是做什么用的???

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

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

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

    使用TM4C129x 微控制器為 TMP1826實(shí)現(xiàn)單線枚舉功能應(yīng)用說明

    電子發(fā)燒友網(wǎng)站提供《使用TM4C129x 微控制器為 TMP1826實(shí)現(xiàn)單線枚舉功能應(yīng)用說明.pdf》資料免費(fèi)下載
    發(fā)表于 09-12 11:10 ?0次下載
    使用TM4<b class='flag-5'>C</b>129x 微控制器為 TMP1826實(shí)現(xiàn)單線<b class='flag-5'>枚舉</b>功能應(yīng)用說明

    BOOSTXL_BUCKCONV評(píng)估板上的高邊電流采樣電路,請(qǐng)問C10-C14都是做什么用的呢?

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