91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

完善資料讓更多小伙伴認識你,還能領取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輸出結果

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

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

最終結果變成了1

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

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

運行輸出結果如下:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

審核編輯 :李倩


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

    關注

    183

    文章

    7645

    瀏覽量

    145836
  • 編譯器
    +關注

    關注

    1

    文章

    1672

    瀏覽量

    51753

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

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

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    講解C語言代碼的實現(xiàn)過程

    重點講解C語言代碼的實現(xiàn)過程,算法的C語言實現(xiàn)過程具有一般性,通過PID算法的C語言實現(xiàn),可以以
    發(fā)表于 01-21 07:58

    【熱敏電阻】什么是材料常數(shù)?有什么用?

    為什么手機能感知電池溫度,防止過熱?為什么智能熱水器能控制水溫?和電子元件—熱敏電阻有關。 熱敏電阻是一種對溫度感知靈敏的電子元件,其電阻值隨著溫度變化而變化。熱敏電阻之所以能感知溫度,和材料常數(shù)有關。 什么是材料常數(shù)?有什么用嗎?
    的頭像 發(fā)表于 01-13 11:22 ?244次閱讀
    【熱敏電阻】什么是材料常數(shù)?有<b class='flag-5'>什么用</b>?

    劃片機是干什么用

    劃片機是干什么用的?在晶圓加工場景中,它也常被稱為晶圓切割機,是半導體制造后道工藝中的核心設備,其核心用途是將完成前道電路制造(如光刻、刻蝕、沉積等)的整片晶圓,沿預設的空白切割道
    的頭像 發(fā)表于 01-12 16:33 ?666次閱讀
    劃片機是干<b class='flag-5'>什么用</b>的

    C語言主要特點

    指針類型數(shù)據(jù),使用十分靈活和多樣化,能用來實現(xiàn)各種復雜的數(shù)據(jù)結構(如鏈表、樹、棧等)的運算。 4.具有結構化的控制語句。函數(shù)作為程序的模塊單位,便于實現(xiàn)程序的模塊化。C語言是完全模塊化和結構化的
    發(fā)表于 01-05 07:41

    如何用好 C 語言函數(shù)的返回值?

    判斷類的代碼。 小結 本文主要討論了C語言程序開發(fā)中關于函數(shù)返回值的問題。可見,使用什么樣的返回值表示成功,什么用的返回值表示失敗,其實只是一種人為約定。 只不過,如果**我們編寫的代碼能夠被
    發(fā)表于 12-25 07:17

    C語言C++的區(qū)別及聯(lián)系

    C語言C++到底是什么關系? 首先C++和C語言本來就是兩種不同的編程
    發(fā)表于 12-24 07:23

    枚舉類型的講解

    枚舉是一個基本的數(shù)據(jù)類型,它可以讓數(shù)據(jù)更簡潔。 如果寫一個判斷星期的文章,我們當然可以使用宏定義來使代碼更加易懂,不過: #define MON 1 #define TUE 2
    發(fā)表于 12-08 08:14

    單片機C語言編程的心得

    出來。 一、.H文件與.C文件的關系: 迄今為止,寫過的程序都是一些很簡單的程序,從來沒有想到要自己寫.H文件,也不知道.H文件到底什么用,與.C文件什么關系。只是最近寫鍵盤程序,參考別人的程序
    發(fā)表于 12-08 07:44

    C語言的常量介紹

    、-13; 實型常量:13.33、-24.4; 字符常量:‘a’、‘M’ 字符串常量:”I love china!” 在C語言中,可以一個標識符來表示一個常量,稱之為符號常量。符號常量在使用之前必須先
    發(fā)表于 11-24 07:12

    C語言特性

    數(shù)據(jù),實現(xiàn)對設備的精準控制,同時降低功耗,延長設備的使用壽命。 2、可移植性:跨平臺的通行證 C 語言具有良好的可移植性,這意味著 C 語言
    發(fā)表于 11-24 07:01

    C語言和單片機C語言有什么差異

    單片機c語言相對于普通C語言增加了一些基本的指令,還有變量的賦值是16進制,當然單片機c語言只牽
    發(fā)表于 11-14 07:55

    功率計/功率分析儀是做什么用的?

    測量用電設備電功率的測量儀叫做功率計或者功率分析儀。功率分為3種,即視在功率、有功功率、無功功率。通常,功率是指有功功率。
    的頭像 發(fā)表于 09-26 15:06 ?841次閱讀
    功率計/功率分析儀是<b class='flag-5'>做什么用</b>的?

    深入理解C語言C語言循環(huán)控制

    C語言編程中,循環(huán)結構是至關重要的,它可以讓程序重復執(zhí)行特定的代碼塊,從而提高編程效率。然而,為了避免程序進入無限循環(huán),C語言提供了多種循環(huán)控制語句,如break、continue和
    的頭像 發(fā)表于 04-29 18:49 ?2098次閱讀
    深入理解<b class='flag-5'>C</b><b class='flag-5'>語言</b>:<b class='flag-5'>C</b><b class='flag-5'>語言</b>循環(huán)控制

    C語言的歷史及程序介紹

    電子發(fā)燒友網站提供《C語言的歷史及程序介紹.pdf》資料免費下載
    發(fā)表于 04-09 16:10 ?0次下載

    51單片機C語言學習筆記

    c51語言快速入門
    發(fā)表于 03-24 14:04 ?3次下載