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

    文章

    7618

    浏览量

    138543
  • 编译器
    +关注

    关注

    1

    文章

    1645

    浏览量

    49429

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

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

收藏 人收藏

    评论

    相关推荐

    在Deepseek AI眼中,配电室是做什么用的?

    DEEPSEEK眼中的配电室什么样?嗯,用户问配电室是做什么用的,我需要先理解配电室的基本功能。配电室听起来像是和电力分配有关的地方,对吧?可能和电力系统有关,比如建筑物或者工厂里的电力分配。首先,我应该明确配电室的主要作用是什么。
    的头像 发表于 03-05 09:38 47次阅读

    AI开源模型库有什么用

    AI开源模型库作为推动AI技术发展的重要力量,正深刻改变着我们的生产生活方式。接下来,AI部落小编带您了解AI开源模型库有什么用
    的头像 发表于 02-24 11:50 96次阅读

    AI项目管理平台有什么用

    当今,AI项目的复杂性和多变性给项目管理带来了前所未有的挑战。为了有效应对这些挑战,AI项目管理平台应运而生。那么,AI项目管理平台有什么用?下面,AI部落小编带您了解。
    的头像 发表于 02-19 11:16 125次阅读

    请问ADS1282中SYNC是做什么用的,和读写程序有关系吗?

    请问ADS1282中SYNC是做什么用的,和读写程序有关系吗?我现在只是给接到了上拉3.3V电阻,不知道这是否和我的程序不一直读0有关系?
    发表于 02-08 09:16

    EE-33:C语言对ADSP-21xx定时器进行编程

    电子发烧友网站提供《EE-33:C语言对ADSP-21xx定时器进行编程.pdf》资料免费下载
    发表于 01-15 15:46 0次下载
    EE-33:<b class='flag-5'>用</b><b class='flag-5'>C</b><b class='flag-5'>语言</b>对ADSP-21xx定时器进行编程

    dac7624 data output timing是做什么用的?

    1:请问左侧的 data output timing 是做什么用的?右侧的是写数字输入的时序吧。2:这款dac可以单纯的IO模拟时序通信吧3:这个t CSD 要求最大不能超过160ns 很多单片机都达不到吧。单纯的翻转下IO,实际
    发表于 01-01 07:52

    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

    尾纤是做什么用

    尾纤是一种光纤连接器,也称为裸光纤或猪尾线。它的一端装有光纤活动连接器,另一端是光缆纤芯的断头,可以通过熔接技术与其他光缆纤芯相连。尾纤在光纤通信网络中起到了关键的作用,主要用于连接不同的光纤设备,以实现光信号的传输和交换。 尾纤在各种光纤通信系统中都有广泛的应用。例如,在大型数据中心中,尾纤用于连接服务器、交换机、路由器等设备,以实现数据的高速传输和交换。在企业局域网中,尾纤则用于连接终端设备(如计
    的头像 发表于 04-30 10:28 1702次阅读

    Linux是做什么用的?

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

    fpga是c语言还是verilog

    FPGA(现场可编程逻辑门阵列)开发主要使用的编程语言是硬件描述语言(HDL),其中Verilog是最常用的编程语言之一。而C语言通常用于传
    的头像 发表于 03-27 14:38 2408次阅读

    fpga的是什么编程语言 fpga什么语言开发

    fpga的是什么编程语言 FPGA(现场可编程逻辑门阵列)主要使用的编程语言是硬件描述语言(HDL)。在众多的HDL中,Verilog HDL和VHDL是最常用的两种。 Verilo
    的头像 发表于 03-14 17:09 3786次阅读

    fpga是做什么用

    FPGA(Field Programmable Gate Array),即现场可编程门阵列,是一种可编程逻辑芯片,其主要作用和功能体现在多个方面。
    的头像 发表于 03-14 15:56 1638次阅读