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

    文章

    7596

    浏览量

    136007
  • 编译器
    +关注

    关注

    1

    文章

    1617

    浏览量

    49024

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

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

收藏 人收藏

    评论

    相关推荐

    TAS5611a的13脚14脚的晶振是做什么用的?

    最近要做一个项目,D类功放立体声输出,接8欧负载时要求功率要50W以上,查看TI芯片资料TAS5611A比较适合,但是我看到资料上面第13脚,14脚有个晶振的接口,请问这个晶振是做什么用的,需要多少MHZ比较合适?
    发表于 10-29 07:18

    请问TLV320AIC3204中Processing Block是做什么用的啊?

    TLV320AIC3204中Processing Block 是做什么用的啊?
    发表于 10-24 08:24

    TAP3118和TPA3116开发板所处位置的电路是做什么用的?

    如图的TAP3118和TPA3116开发板所处位置的电路是做什么用的,为什么在芯片PDF里面这里这个电路却没有,而是在电感输出那里加了一个1nF对地,这两种方式有什么不一样
    发表于 10-12 08:23

    BOOSTXL_BUCKCONV评估板上的高边电流采样电路,请问C10-C14都是做什么用的呢?

    这是ti的BOOSTXL_BUCKCONV评估板上的高边电流采样电路,请问C10-C14都是做什么用的呢?是用来补偿相位吗?如果不是的话是做什么用的呢?这些电容值怎么计算呢
    发表于 09-06 06:29

    Linux是做什么用的?

    Linux是做什么用的?Linux是一种开源的操作系统,广泛用于服务器、嵌入式设备和个人电脑等领域。它具有以下特点和用途: Linux是做什么用的? 1、服务器操作系统:Linux在服务器领域非常
    发表于 04-28 15:40

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

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

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

    枚举有多大?c语言枚举end的作用是什么? 枚举C
    的头像 发表于 01-19 14:19 546次阅读

    填充胶是做什么用的?

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

    变频器中的制动电阻是做什么用的?制动电阻为什么接直流母排上?

    变频器中的制动电阻是做什么用的?制动电阻为什么接直流母排上? 变频器中的制动电阻是用来通过转换电能为热能来实现制动功能的。制动电阻会将通过电机产生的过多能量散发到周围环境中,以保持电机运行的平稳性
    的头像 发表于 12-29 10:56 1727次阅读

    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 723次阅读

    pcb仿真技术有什么用

    pcb仿真技术有什么用
    的头像 发表于 11-28 15:22 1062次阅读

    C语言开发DSP系统全过程

    电子发烧友网站提供《C语言开发DSP系统全过程.pdf》资料免费下载
    发表于 11-18 10:57 0次下载
    <b class='flag-5'>用</b><b class='flag-5'>C</b><b class='flag-5'>语言</b>开发DSP系统全过程

    C语言开发DSP系统的全过程讲解

    电子发烧友网站提供《C语言开发DSP系统的全过程讲解.pdf》资料免费下载
    发表于 11-18 10:53 0次下载
    <b class='flag-5'>用</b><b class='flag-5'>C</b><b class='flag-5'>语言</b>开发DSP系统的全过程讲解