難倒高手了,c語言枚舉end的作用是什么?
來源:小麥大叔

枚舉有多大
枚舉類型到底有多大,占多少空間呢?這個要具體情況具體分析,編譯器會視情況而定。
下面是我測試用的編譯器版本。
gcc?(Ubuntu?7.5.0-3ubuntu1~18.04)?7.5.0
Copyright?(C)?2017?Free?Software?Foundation,?Inc.
This?is?free?software;?see?the?source?for?copying?conditions.??There?is?NO
warranty;?not?even?for?MERCHANTABILITY?or?FITNESS?FOR?A?PARTICULAR?PURPOSE.
當我寫下這段代碼的時候,實際的輸出會是多少呢?

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

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

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

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

是的,它變成了2。因此我們可以得出結(jié)論就是:
編譯器將為枚舉分配足夠的內(nèi)存大小,來保存我們所聲明的任何值。所以,如果我們的代碼中只使用低于 256(8位的范圍是0~255) 的值,我們的枚舉應(yīng)該是 8 位寬,也就是一個字節(jié),而后面的
0xFFFF顯然是16位,兩個字節(jié),所以最終輸出為2
為此我參考了一下gcc user manual,如下;
https ://gcc.gnu.org/onlinedocs/gcc/Code-Gen-Options.html
-fshort-enumsAllocate to an
enumtype only as many bytes as it needs for the declared range of possible values. Specifically, theenumtype is equivalent to the smallest integer type that has enough room.Warning: the
-fshort-enumsswitch 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.
所以,我們需要明確的是編譯器是否會默認執(zhí)行 -fshort-enums這個命令,大多數(shù)是不會的,這里我還測試了一些clang,具體結(jié)果和gcc相同。
但是在嵌入式編程中需要注意,這里我查了一下,IAR的編譯器默認會執(zhí)行 -fshort-enums 。
電腦上沒有IAR,這里我參考了IAR 的 ARM C 編譯器的文檔IAR C/C++ Development Guide。

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


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

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

看來雖然是一個很小的知識點,但是這中間的坑還真不少,好了,本期的文章就到這里了,我們下期再見。
如果感覺文章幫到了您,動手三連,讓文章幫到更多的人。
???????????????? ?END ????????????????
關(guān)注我的微信公眾號,回復(fù)“加群”按規(guī)則加入技術(shù)交流群。
點擊下面圖片,有星球具體介紹,新用戶有新人優(yōu)惠券,老用戶半價優(yōu)惠,期待大家一起學(xué)習(xí)一起進步。
點擊“閱讀原文”查看更多分享,歡迎點分享、收藏、點贊、在看。
