C和C++11之enum枚举的具体使用方法

 更新时间:2020年12月09日 09:18:42   作者:李春港  
这篇文章主要介绍了C和C++11之enum枚举的具体使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、前言

由于C++项目中用了相对比较多的枚举(enum),正常情况下,枚举变量都是占用一个整形类型的大小,但是项目中枚举(enum)只需要使用到一个字节的大小,因为是在嵌入式设备上执行的代码,资源比较少,那么如果枚举都是按照int型大小来使用的话,这无疑是一种资源浪费。

所以就想有没有一种办法可以控制枚举(enum)占用内存的办法。所幸,通过查找资料,发现C++11的新特性刚好加入了控制枚举大小的机制。那么接下来我们就来看看,枚举(enum)在C++11标准有哪些变化?以及C和C++11中的枚举(enum)有什么区别?

二、C中的枚举(enum)

2.1 C中枚举的大小

前面有说到,默认情况下,枚举enum的大小是一个整形类型的大小,但是整形类型有很多:int、long int、short int等,所以enum的大小还是不能确定的。在C中enum的大小是不可以通过程序员显式控制的,这个大小是编译器根据我们给枚举(enum)赋值的大小来选择合适的整数类型的。

下面举个例子:

/*****************************************************************************
** Copyright © 2020 lcg. All rights reserved.
** File name: enum.c
** Description: 测试enum的特性
** Author: lcg
** Version: 1.0
** Date: 2020.12.08
*****************************************************************************/
 
#include <stdio.h>
 
enum color1
{
  RED = 0,
  GREEN,
  BLUE
};
 
enum color2
{
  GRAY = 0x1122334455,
  YELLOW,
  PURPLE
};
 
int main(int argc, char *argv[])
{
  printf("enum color1: %d\n", sizeof(enum color1));
  printf("enum color2: %d\n", sizeof(enum color2));
  return 0;
}

输出结果:

enum color1: 4
enum color2: 8

我们发现这两个枚举变量所占用的大小是不一样的,enum color2已经超过了4个字节,所以编译器会根据实际值的大小来调整枚举变量的大小。

这就存在了一个弊端,当我们定义的一个结构体里面有枚举变量的时候,当枚举变量值变化的时候,那么结构体的大小就有可能会跟着变化。在没有给枚举赋值的时候为结构体申请了堆空间,后面如果给枚举赋了一个超过4个字节的值,那么这个时候结构体的实际大小就已经变化了,这样我们后面程序对该结构体进行操作时就会存在隐患。

2.2 C中枚举的取值范围

我们继续使用上面的例程来说明取值范围:

/*****************************************************************************
** Copyright © 2020 lcg. All rights reserved.
** File name: enum.c
** Description: 测试enum的特性
** Author: lcg
** Version: 1.1
** Date: 2020.12.08
*****************************************************************************/
 
#include <stdio.h>
 
enum color1
{
  RED = 0,
  GREEN,
  BLUE
};
 
enum color2
{
  GRAY = 1,
  YELLOW,
  PURPLE
};
 
int main(int argc, char *argv[])
{
  enum color1 myClolor1;
  
  myClolor1 = RED;
  printf("myClolor1: %d\n", myClolor1);
  
  myClolor1 = GRAY;
  printf("myClolor1: %d\n", myClolor1);
  
  myClolor1 = 10;
  printf("myClolor1: %d\n", myClolor1);
  
  return 0;
}

输出结果:

myClolor1: 0
myClolor1: 1
myClolor1: 10

可以看到,在C下enum定义的变量可以赋规定范围外的值的,但是在C++11下这是不允许的。在C++11中编译会不通过,是C++11对C中enum的优化。

三、C++11中的枚举(enum)

3.1 c++11中新增枚举大小的控制

在C++11中程序员就可以对枚举(enum)进行显式控制其占用内存的大小了,如下示例:

/*****************************************************************************
** Copyright © 2020 lcg. All rights reserved.
** File name: enum.cpp
** Description: 测试enum的特性
** Author: lcg
** Version: 1.2
** Date: 2020.12.08
*****************************************************************************/
 
#include <stdio.h>
 
enum color1 : char {
  RED = 0,
  GREEN,
  BLUE
};
 
enum color2 : int {
  GRAY = 1,
  YELLOW,
  PURPLE
};
 
int main(int argc, char *argv[])
{
  printf("enum color1: %d\n", sizeof(enum color1));
  printf("enum color2: %d\n", sizeof(enum color2));
  
  return 0;
}

输出结果:

enum color1: 1
enum color2: 4

C++11这样的特性就可以很好地解决我在前言所说的那些情况啦,可以节省资源。

3.2 c++11新增有作用域的枚举类型

如上面2.2小节的程序如果在C++11的标准中编译就会出现以下的报错:

1.cpp:33:15: error: cannot convert ‘color2' to ‘color1' in assignment
     myClolor1 = GRAY;
               ^
1.cpp:36:15: error: invalid conversion from ‘int' to ‘color1' [-fpermissive]
     myClolor1 = 10;

在C++11标准中,enum定义的变量是不可以赋规定范围外的值的。这样为后期的调试带来了很多的便利之处。

到此这篇关于C和C++11之enum枚举的具体使用方法的文章就介绍到这了,更多相关C++11 enum枚举内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言堆栈帧的介绍与创建

    C语言堆栈帧的介绍与创建

    这篇文章主要给大家介绍了关于C语言堆栈帧的相关资料,堆栈帧 (stack frame)( 或活动记录 (activation Tecord)) 是一块堆栈保留区域,用于存放被传递的实际参数、子程序的返回值、局部变量以及被保存的寄存器,需要的朋友可以参考下
    2021-08-08
  • 论C++的lambda是函数还是对象

    论C++的lambda是函数还是对象

    这篇文章主要介绍了论C++的lambda是函数还是对象,对于有捕获的lambda,其等价于对象。对于没有任何捕获的lambda,其等价于函数,下面来看看具体的相关内容,需要的朋友可以参考一下
    2022-02-02
  • C语言实现循环打印星号图形再镂空

    C语言实现循环打印星号图形再镂空

    这篇文章主要介绍了C语言实现循环打印星号图形再镂空,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • C/C++实现7bit与8bit编码互相转换

    C/C++实现7bit与8bit编码互相转换

    这篇文章主要为大家详细介绍了如何使用C/C++实现7bit与8bit编码互相转换功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-10-10
  • C++中函数重载与引用的操作方法

    C++中函数重载与引用的操作方法

    C++中函数重载允许同名函数根据参数列表的不同而执行不同的功能,这依赖于名字修饰或名字改编(Name Mangling)机制,而引用则是为变量创建一个别名,不会开辟新的内存空间,本文介绍了C++中函数重载与引用的操作,感兴趣的朋友一起看看吧
    2024-10-10
  • C++顺序表的基本操作(使用模版类)

    C++顺序表的基本操作(使用模版类)

    这篇文章主要为大家详细介绍了C++顺序表的基本操作,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • 使用C语言来画出皮卡丘的教程(附代码)

    使用C语言来画出皮卡丘的教程(附代码)

    在C语言中使用图形库画图需要引入graphics.h库,我们可以通过代码实现画出一个可爱的皮卡丘,将皮卡丘的绘制分为以下部分:耳朵、脸部、眼睛、嘴巴、手臂、腿部、尾巴,下面我们就来学习如何使用C语言编写画皮卡丘的代码
    2024-01-01
  • C++实现宠物商店信息管理系统

    C++实现宠物商店信息管理系统

    这篇文章主要为大家详细介绍了C++实现宠物商店信息管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • C++求1到n中1出现的次数以及数的二进制表示中1的个数

    C++求1到n中1出现的次数以及数的二进制表示中1的个数

    这篇文章主要介绍了C++求1到n中1出现的次数以及数的二进制表示中1的个数,两道基础的算法题目,文中也给出了解题思路,需要的朋友可以参考下
    2016-02-02
  • C++数组指针和二维数组详情

    C++数组指针和二维数组详情

    这篇文章主要介绍了C++数组指针和二维数组,指针数组和二维数组在应用中常用于函数传参,下面我们就来看看指针数组和二维数组在应用中的具体使用吧,需要的朋友可以参考一下
    2021-10-10

最新评论