点击上方“小麦大叔”,选择“置顶/星标公众号”

福利干货,第一时间送达

大家好,我是小麦。
我在知乎上看到这个问题,一开始,也有一些疑惑,后面查了一些资料,对于这个问题,简单的说一下我的看法。

枚举有多大

枚举类型到底有多大,占多少空间呢?这个要具体情况具体分析,编译器会视情况而定。

下面是我测试用的编译器版本。

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

输出结果

但是这个结果并不是唯一的,它取决于你的编译器,另外还取决于编译器参数,gcc这里有个编译器参数 -fshort-enums,如果我们在编译的时候加上这个,那么编译出来是什么呢?

短枚举的输出结果

最终结果变成了1

现在我在原先的代码中,加入CMD_MAX_16BIT = 0xFFFF,下面看看输出结果是多少。

增带值范围

运行输出结果如下:

输出结果

是的,它变成了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

可以看到enum类型默认的规定,如果要强制为int类型的话,需要编译的时候提那就--enum_is_int的编译参数,如下所示;

枚举类型

所以这里为了避免编译器的优化,以及不同的硬件平台和不同编译器,从而导致枚举分配内存空间的变化,所以上述增加了一个0xFFFFFFFF,强制编译器为枚举分配4个字节的空间。

设置最大范围为4字节

最终的输出结果都是4,如下图所示;

输出结果比较

看来虽然是一个很小的知识点,但是这中间的坑还真不少,好了,本期的文章就到这里了,我们下期再见。

如果感觉文章帮到了您,动手三连,让文章帮到更多的人。

—— The End ——

往期推荐

30个单片机常见问题解决办法!一般人我不告诉他们

马斯克的脑机接口,一块树莓派就能做出来?

高手常用的3个开源库,让单片机开发事半功倍

看似简单的代码,却暗藏玄机...

如何防止破解?MCU加密技术揭秘

加入嵌入式技术交流群一起进步

点击名片关注我

你点的每个好看,我都认真当成了喜欢

难倒高手了,c语言枚举end的作用是什么?相关推荐

  1. c语言枚举类型变量的作用

    #include<stdio.h>enum DAY {MON=1, TUE, WED, THU, FRI, SAT, SUN };int main() {enum DAY day; //定 ...

  2. c语言 枚举,位运算

    c语言 枚举,位运算 枚举 枚举类型的定义和枚举变量的说明 一.枚举的定义枚举类型定义的一般形式为 二.枚举变量的说明 枚举类型变量的赋值和使用 位运算 位域 一.位域的定义和位域变量的说明 二.位域 ...

  3. c语言枚举法礼泡声次数,C语言枚举类型举例

    C语言枚举类型举例 注:以下全部代码的执行环境为VC++ 6.0 宏和枚举的区别 宏和枚举之间的差别主要在作用的时期和存储的形式不同,宏是在预处理的阶段进行替换工作的,它替换代码段的文本,程序运行的过 ...

  4. c语言 枚举类型 uint32_浅谈C语言枚举类型 | 附自创用法分享

    经济学家说过,路边是不会有100元的:但如果有,你还是要捡起来. 同理,在貌似万物免费的网络时代,你是很难找到有针对性的好资料:但是如果有,希望你能认真学习吸收. 比如笔者今天写的这一篇 一 今天这篇 ...

  5. C语言枚举类型(Enum)

    C语言枚举类型(Enum) 在实际编程中,有些数据的取值往往是有限的,只能是非常少量的整数,并且最好为每个值都取一个名字,以方便在后续代码中使用,比如一个星期只有七天,一年只有十二个月,一个班每周有六 ...

  6. c++枚举和c语言枚举_C语言枚举初学者指南

    c++枚举和c语言枚举 Hey, folks! Hope you all are doing well. In this article, we will be discussing Enumerat ...

  7. c语言头文件格式图片_请高手赐教C语言图片文件头文件格式的解释,该怎么处理...

    当前位置:我的异常网» C语言 » 请高手赐教C语言图片文件头文件格式的解释,该怎么 请高手赐教C语言图片文件头文件格式的解释,该怎么处理 www.myexceptions.net  网友分享于:20 ...

  8. C++ 语言枚举 (enumeration, enum)

    C++ 语言枚举 (enumeration, enum) 1. enum in C++ Enumeration (enum) is a user-defined datatype (same as s ...

  9. c语言枚举类型编程,浅析C语言枚举类型

    在学习C语言的结构体过程中,我们接触到比较重要的内容要数枚举类型这一环了.那么到底什么是C语言中的枚举类型呢?它在我们编写程序时又起着什么样的作用呢?下面课课家小编就为大家简单介绍C语言中的枚举类型和 ...

  10. c语言怎么用枚举类型的字符串,c语言枚举类型的用法

    枚举类型就相当于助记符,帮助程序员记忆的.比如现在要画一张地图,用到红黄蓝绿四种颜色.为了存储方便,我们规定0=红,1=黄,2=蓝,3=绿.但是当编程到某一阶段时,程序员可能忘记了哪个数字具体对应哪种 ...

最新文章

  1. Tkinter的Checkbutton组件的简单使用
  2. JDK 8与JDK 10:三元/拆箱的区别
  3. 【阅读笔记】频率视角下的机器学习
  4. 人工智能——产生式系统(动物识别产生式系统)项目开发
  5. GoogleEarth二次开发平台指南(4) --- 三维视频融合、视频拼接与摄像头控制
  6. 5gh掌上云计算认证不通过_2018年阿里云ACP云计算认证多少分通过,怎么报名,如何参加考试...
  7. 浏览器内核(引擎)及css前缀
  8. python抓取豆瓣电影
  9. 【Swift】文档分享到其他应用
  10. 记录安装tensorflow-gpu,版本选择问题,短平快解决战斗
  11. Word中给论文添加引用
  12. 微软的软件测试工程师——《微软的软件测试之道》
  13. 火影推荐程序连载14-Vue开源项目使用探索
  14. 环境变量的用户变量与系统变量的区别
  15. 前端模块依赖复杂度太高,一团乱麻了怎么办
  16. Jmeter 正则表达式说明
  17. 搭建股票量化交易系统QTYX—持续进阶之路[更新至V2.5.2]
  18. word超链接显示HYPERLINK
  19. HTML/CSS制作阿里巴巴注册界面
  20. tiup cluster reload

热门文章

  1. 前端判断文件后缀名_JS - 获取文件后缀,判断文件类型(比如是否为图片格式)...
  2. 如何在Tomcat后台通过文件上传getshell总结(个人学习笔记思路)
  3. 大数据方面核心技术有哪些
  4. 使用mentohust解决ubuntu下校园网无法连接
  5. 数据库的ACID是什么
  6. 专注于Win7系统清除附带推广和工具
  7. 专注于win7官网,专注win7系统安装
  8. 霍夫斯特拉大学计算机科学专业排名,霍夫斯特拉大学排名 - hofstra computer science怎么样...
  9. excel多个工作表合并怎么操作
  10. 【UI界面开发】背包系统一般思路