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语言
    +关注

    关注

    183

    文章

    7642

    浏览量

    144680
  • 编译器
    +关注

    关注

    1

    文章

    1670

    浏览量

    51108

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    枚举类型的讲解

    枚举是一个基本的数据类型,它可以让数据更简洁。 如果写一个判断星期的文章,我们当然可以使用宏定义来使代码更加易懂,不过: #define MON 1 #define TUE 2
    发表于 12-08 08:14

    C语言特性

    数据,实现对设备的精准控制,同时降低功耗,延长设备的使用寿命。 2、可移植性:跨平台的通行证 C 语言具有良好的可移植性,这意味着 C 语言
    发表于 11-24 07:01

    C语言和单片机C语言有什么差异

    单片机c语言相对于普通C语言增加了一些基本的指令,还有变量的赋值是16进制,当然单片机c语言只牵
    发表于 11-14 07:55

    深入理解C语言C语言循环控制

    C语言编程中,循环结构是至关重要的,它可以让程序重复执行特定的代码块,从而提高编程效率。然而,为了避免程序进入无限循环,C语言提供了多种循环控制语句,如break、continue和
    的头像 发表于 04-29 18:49 1751次阅读
    深入理解<b class='flag-5'>C</b><b class='flag-5'>语言</b>:<b class='flag-5'>C</b><b class='flag-5'>语言</b>循环控制

    C语言的历史及程序介绍

    电子发烧友网站提供《C语言的历史及程序介绍.pdf》资料免费下载
    发表于 04-09 16:10 0次下载

    交换机配置snmp有什么用

    在复杂的网络环境中,交换机作为核心设备之一,其稳定性和性能直接影响整个网络的运行效率。而SNMP(简单网络管理协议)作为网络管理的标准协议,能够帮助管理员高效监控和管理交换机,确保网络的正常运行。小编将在本文中详细介绍交换机配置snmp有什么用
    的头像 发表于 03-19 10:26 940次阅读

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

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

    AI开源模型库有什么用

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

    DLPC7540EVM整个色段周期有80μs的时间RGB_EN都同时为低电平,请问DLP在做什么工作或者预留的这80μs是有什么用途?

    DLPC7540EVM整个色段周期有80μs的时间RGB_EN都同时为低电平,请问这个时间DLP在做什么工作或者预留的这80μs是有什么用途?
    发表于 02-24 07:20

    AI项目管理平台有什么用

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

    这是什么芯片?

    帮忙看下,这个芯片是做什么用的?
    发表于 02-10 17:06

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

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

    MATLAB或者C语言开发FPGA有什么问题吗

    最近有个项目领导要求MATLAB开发FPGA,有大佬MATLAB或者C语言开发FPGA的吗,有没有什么问题,需要注意什么问题吗
    发表于 01-26 09:57

    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