当前位置: 首页 > news >正文

c++之enum的好处与 define 的区别

转载自 https://blog.csdn.net/zhh464626057/article/details/41038933

什么时候需要用到enum呢?就是变量的数值在几个范围之间。
red,blue,black.这样用enum比较好.当然也可以用define.但是define维护起来比较麻烦. #define 适合比较少的变量的时候.

 

与用#define指令说明常量(即说明标识符常量)相比,用enum关键字说明常量(即说明枚举常量)有以下几点好处:

 

1、使程序更容易维护,因为枚举常量是由编译程序自动生成的,而标识符常量必须由程序员手工赋值。例如,你可以定义一组枚举常量,作为程序中可能发生的错误的错误号,请看下例:

[cpp] view plain copy
 
  1. enum Error_Code{  
  2.     OUT_OF_MEMORY,  
  3.     INSUFFICIENT_DISK_SPACE,  
  4.     LOGIC_ERROR,  
  5.     FILE_NOT_FOUND  
  6. }  

 在上例中,OUT_OF_MEMORY等枚举常量依次被编译程序自动赋值为0,1,2和3。 同样,你也可以用#define指令说明类似的一组常量,请看下例: 
   
[cpp] view plain copy
 
  1. #define OUT_OF_MEMORY 0   
  2. #define INSUFFICIENT_DISK_SPACE 1   
  3. #define LOGIC_ERROR 2   
  4. #define FILE_NOT_FOUND 3  


 上述两例的结果是相同的。假设你要增加两个新的常量,例如DRIVE_NOT_READY和CORRUPT_FILE。如果常量原来是用enum关键字说明的,你可以在原来的常量中的任意一个位置插入这两个常量,因为编译程序会自动赋给每一个枚举常量一个唯一的值;如果常量原来是用#define指令说明的,你就不得不手工为新的常量赋值。在上面的例子中,你并不关心常量的实际值,而只关心常量的值是否唯一,因此,用enum关键字说明常量使程序更容易维护,并且能防止给不同的常量赋予相同的值。 
   

2、使程序调试起来更方便,因为某些标识符调试程序能打印枚举常量的值。这一点在调试程序时是非常用的,因为如果你的程序在使用枚举常量的一行语句中停住了,你就能马上检查出这个常量的值;反之,绝大多数调试程序无法打印标识符常量的值,因此你不得不在头文件中手工检查该常量的值。 

3、枚举和define都可以swtich,枚举是类型安全的 define不是类型安全的,枚举只能定义整形值,define能定义几乎任何值 

 

[cpp] view plain copy
 
  1. enum NodeType {AND, OR};   
  2. void main() {   
  3. NodeType type;   
  4. switch(type)  
  5. {   
  6. case AND:break;   
  7. case OR:break;   
  8. }   
  9. return 0;   
  10. }   

 

4、宏和枚举之间的差别主要在作用的时期和存储的形式不同,宏是在预处理的阶段进行替换工作的,它替换代码段的文本,程序运行的过程中宏已不存在了。而枚举是在程序运行之后才起作用的,枚举常量存储在数据段的静态存储区里。宏占用代码段的空间,而枚举除了占用空间,还消耗CPU资源。

但也不能就此说宏比枚举好,如果需要定义非常多的常量,用一条enum {.....}明显比一大堆define更清晰。

 

转载于:https://www.cnblogs.com/zhougong/p/8876539.html

相关文章:

  • 利用itext导出PDF的小例子
  • Linux 防火墙开放特定端口 (iptables)
  • kafka知识体系-kafka数据可靠性和一致性保证
  • 结对编程收获
  • Ojective-C学习笔记(4)关于面向对象编程
  • I函数
  • 猫狗大战
  • 洛谷 2055 BZOJ 1433 [ZJOI2009]假期的宿舍
  • UVA 10891 Game of Sum(区间DP(记忆化搜索))
  • Python学习4,字符串
  • BZOJ 3097: Hash Killer I
  • [转组第一天] | 调研XSS攻击
  • 2018年最新搜索引擎转跳JavaScript代码(竞价广告专用)
  • Java多线程实现的三种方式
  • 服务端渲染
  • 07.Android之多媒体问题
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • Docker入门(二) - Dockerfile
  • Electron入门介绍
  • Facebook AccountKit 接入的坑点
  • Javascript设计模式学习之Observer(观察者)模式
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • Linux各目录及每个目录的详细介绍
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • SQL 难点解决:记录的引用
  • v-if和v-for连用出现的问题
  • Vue2 SSR 的优化之旅
  • Vue小说阅读器(仿追书神器)
  • windows下使用nginx调试简介
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 关于springcloud Gateway中的限流
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 排序(1):冒泡排序
  • 系统认识JavaScript正则表达式
  • 想使用 MongoDB ,你应该了解这8个方面!
  • 如何正确理解,内页权重高于首页?
  • #android不同版本废弃api,新api。
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (转)Linux下编译安装log4cxx
  • (转)项目管理杂谈-我所期望的新人
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • ****Linux下Mysql的安装和配置
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • .NET MVC第五章、模型绑定获取表单数据
  • .NET 使用 XPath 来读写 XML 文件
  • .NET 中选择合适的文件打开模式(CreateNew, Create, Open, OpenOrCreate, Truncate, Append)
  • .NET的微型Web框架 Nancy
  • .NET关于 跳过SSL中遇到的问题
  • .NET开发人员必知的八个网站
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • .pyc文件是什么?
  • .vue文件怎么使用_我在项目中是这样配置Vue的
  • 。Net下Windows服务程序开发疑惑
  • /etc/shadow字段详解
  • [ element-ui:table ] 设置table中某些行数据禁止被选中,通过selectable 定义方法解决