0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取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输出结果

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

ab6814f8-c3b9-11ec-bce3-dac502259ad0.png短枚举的输出结果

最终结果变成了1

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

ab7345ee-c3b9-11ec-bce3-dac502259ad0.png增带值范围

运行输出结果如下:

ab8022a0-c3b9-11ec-bce3-dac502259ad0.png输出结果

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

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

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

ab993178-c3b9-11ec-bce3-dac502259ad0.png枚举类型aba6d9d6-c3b9-11ec-bce3-dac502259ad0.png

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

abb5b62c-c3b9-11ec-bce3-dac502259ad0.png设置最大范围为4字节

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

abd0b224-c3b9-11ec-bce3-dac502259ad0.png输出结果比较

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

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7528

    浏览量

    128426
  • 编译器
    +关注

    关注

    1

    文章

    1576

    浏览量

    48606

原文标题:难倒高手了,c语言枚举end的作用是什么?

文章出处:【微信号:mcu168,微信公众号:硬件攻城狮】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    SENT协议SPC功能是做什么用的?

    SENT协议SPC功能是做什么用的?并且应用synchronous , range selection , ID selection 与 bidrectional transmit 模式中
    发表于 02-02 13:19

    枚举有多大?c语言枚举end的作用是什么?

    枚举有多大?c语言枚举end的作用是什么? 枚举在C语言中是一种常见的数据类型,用于定义一组相互
    的头像 发表于 01-19 14:19 200次阅读

    填充胶是做什么用的?

    填充胶是做什么用的?填充胶是一种广泛应用于电子制造和其他工业领域的材料,它在提高产品性能、增强结构稳定性以及保护核心组件方面发挥着至关重要的作用。以下是关于填充胶的主要用途和它
    的头像 发表于 01-17 14:52 467次阅读
    填充胶是<b class='flag-5'>做什么用</b>的?

    ADA4932-2输出端的RL是做什么用的?

    我现在用的是ADA4932-2,+5V供电,差分输出为0.5Vp-p,共模电压1.5V。 我看到芯片资料上写到 我的运放差分输出端也并了一个RL,但是我很奇怪这个RL是做什么用的?我在电路中
    发表于 12-22 06:22

    AD7606地端的电阻R17是做什么用的呢?

    大家好,我看到AD7606的评估板原理图上模拟输入端与对应的地上都接了电阻,这里地端的电阻R17是做什么用的呢?是否是因为7606内部前端是差分放大器,正负端需要匹配吗?另外这里的R5又是做什么用的呢? 请大家不吝赐教。谢谢~
    发表于 12-15 06:20

    C语言必备知识枚举

    枚举类型是ANSI C新标准所增加的。如果一个变量只有几种可能的值,可以定义为枚举类型。所谓“枚举是指将变量的值一一列举出来,变量的值只限于列举出来的值的范围内。
    的头像 发表于 11-29 16:07 476次阅读

    什么是虚拟线程?虚拟线程到底是做什么用的呢?

    虚拟线程是在Java并发领域添加的一个新概念,那么虚拟线程到底是做什么用的呢?
    的头像 发表于 10-29 10:23 1098次阅读
    什么是虚拟线程?虚拟线程到底是<b class='flag-5'>做什么用</b>的呢?

    单片机C语言指针有什么用处呢?

    单片机C语言指针有什么用处呢
    发表于 10-23 07:18

    串口在传输的时候奇偶校验位是做什么用的?

    串口在传输的时候奇偶校验位是做什么用
    发表于 10-12 08:06

    C语言枚举的基本概念和常见用法

    在C语言中,枚举是一种方便组织和表示一组相关常量的工具。枚举类型有助于提高代码的可读性和可维护性。本文将介绍C语言枚举的基本概念、语法和用法
    发表于 08-17 15:32 769次阅读

    在蜂鸟e203中,顶层信号中“sysmem”总线是做什么用的?

    在蜂鸟e203中,顶层信号中“sysmem”总线是做什么用
    发表于 08-12 08:02

    工控机是做什么用

    工控机是做什么用的 工控机是一种专门设计用于工业控制和自动化领域的计算机设备,主要用于工业控制系统、自动化设备、智能机器人等领域的控制和数据处理。工控机通常具有高可靠性、高稳定性、长期运行能力以及
    发表于 07-03 14:21 489次阅读

    请问PRNG能做什么用

    PRNG能做什么用
    发表于 06-26 06:43

    请问NuMaker-ETM-M487开发板这个端口做什么用的?

    请问NuMaker-ETM-M487开发板这个端口做什么用的?谢谢!
    发表于 06-21 06:17

    USB外部VBUS管理器管脚是做什么用的啊?

    USB外部VBUS管理器管脚是做什么用的啊 一个使能脚一个状态脚
    发表于 06-16 08:47