
枚舉有多大
枚舉類型到底有多大,占多少空間呢?這個(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ì)是多少呢?

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

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

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

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

是的,它變成了2
。因此我們可以得出結(jié)論就是:
編譯器將為枚舉分配足夠的內(nèi)存大小,來(lá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, theenum
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
。
電腦上沒(méi)有IAR,這里我參考了IAR 的 ARM C 編譯器的文檔IAR C/C++ Development Guide。

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


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

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

看來(lái)雖然是一個(gè)很小的知識(shí)點(diǎn),但是這中間的坑還真不少,好了,本期的文章就到這里了,我們下期再見(jiàn)。
審核編輯 :李倩
-
C語(yǔ)言
+關(guān)注
關(guān)注
180文章
7632瀏覽量
141724 -
編譯器
+關(guān)注
關(guān)注
1文章
1662瀏覽量
50217
原文標(biāo)題:難倒高手了,c語(yǔ)言枚舉end的作用是什么?
文章出處:【微信號(hào):mcu168,微信公眾號(hào):硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
交換機(jī)配置snmp有什么用?
在Deepseek AI眼中,配電室是做什么用的?
AI開(kāi)源模型庫(kù)有什么用
AI項(xiàng)目管理平臺(tái)有什么用
請(qǐng)問(wèn)ADS1282中SYNC是做什么用的,和讀寫程序有關(guān)系嗎?
EE-33:用C語(yǔ)言對(duì)ADSP-21xx定時(shí)器進(jìn)行編程

dac7624 data output timing是做什么用的?
使用C語(yǔ)言實(shí)現(xiàn)函數(shù)模板
C語(yǔ)言與Java語(yǔ)言的對(duì)比
TAS5611a的13腳14腳的晶振是做什么用的?
C語(yǔ)言中最常見(jiàn)的宏定義寫法
請(qǐng)問(wèn)TLV320AIC3204中Processing Block是做什么用的啊?
TAP3118和TPA3116開(kāi)發(fā)板所處位置的電路是做什么用的?
使用TM4C129x 微控制器為 TMP1826實(shí)現(xiàn)單線枚舉功能應(yīng)用說(shuō)明

評(píng)論