嵌入式开发-枚举详解

朱有鹏

1.枚举m

1.1、枚举是用来干嘛的?

#include

// 这个枚举用来表示函数返回值,ERROR表示错,RIGHT表示对

enum return_value

{

ERROR,        // 枚举值常量是全局的,直接自己就可以用。

RIGHT,

};

enum return_value func1(void);

int main(void)

{

enum return_value r = func1();

if (r == RIGHT)        // 不是r.RIGHT,也不是return_value.RIGHT

{

printf("函数执行正确\n");

}

else

{

printf("函数执行错误\n");

}

printf("ERROR = %d.\n", ERROR);//ERROR =0

printf("RIGHT = %d.\n", RIGHT);                // RIGHT = 1证明枚举

//中的枚举值是常量

return 0;

}

enum return_value func1(void)

{

enum return_value r1;

r1 = ERROR;

return r1;

}

枚举在C语言中其实是一些符号常量集。直白点说:枚举定义了一些符号,这些符号的本质就是int类型的常量,每个符号和一个常量绑定。这个符号就表示一个自定义的一个识别码,编译器对枚举的认知就是符号常量所绑定的那个int类型的数字。

枚举中的枚举值都是常量,怎么验证?

枚举符号常来那个来说,数字不重要,符号才重要。符号对应的数字只要彼此不相同即可,没有别的要求。所以一般情况下我们都不会明确指定这个符号所对应的数字,而是让编译器自动分配。编译器自动分配的原则是,从0开始依次增加,如果用户自己定义了一个值,则从定义的那个值开始往后依次增加。

1.2、C语言为何需要枚举

C语言没有枚举是可以的。使用枚举其实就是对1、0这些数字进行符号化编码,这样的好处就是编程时可以不用看数字而直接看符号。符号的意义是显然的,一眼可以看出。而数字所代表的含义除非看文档或者注释。

宏定义的目的和意义是,不用数字而用符号,从这里可以看出,宏定义和枚举有内在联系。宏定义和枚举经常用来解决类似的问题,他们俩基本可以互换,但是有一些细微差别。

1.3、宏定义和枚举的区别

枚举是将多个有关联的符号封装在一个枚举中,而宏定义是完全散的。什么情况下用枚举?当我们要定义的常量是一个有限集合时(譬如一星期有7天,譬如一个月有31天,譬如一年有12个月····),最适合用枚举。(其实宏定义也行,但是枚举更好),不能用枚举的情况下(定义的常量符号之间无关联,或者无限的)用宏定义。

宏定义最先出现,用来解决符号常量的问题,后来人们发现有时候定义的符号常量彼此之间有关联(多选一的关系),用宏定义来做虽然可以但是不贴切,于是乎发明了枚举来解决这种情况。

1.4、枚举的各种不同的定义形式

(1)定义方法1:定义类型和定义变量分离开

enum week

{

SUN,                // SUN = 0

MON,                // MON = 1;

TUE,

WEN,

THU,

FRI,

SAT,

};

enum week today;

(2)定义方法2:定义类型的同时定义变量

enum week

{

SUN,                // SUN = 0

MON,                // MON = 1;

TUE,

WEN,

THU,

FRI,

SAT,

}today,yesterday;

(3)定义方法3,定义类型的同时定义变量

enum

{

SUN,                // SUN = 0

MON,                // MON = 1;

TUE,

WEN,

THU,

FRI,

SAT,

}today,yesterday;

(4)定义方法4:用typedef定义枚举类型别名,并在后面使用别名进行变量定义

typedef enum week

{

SUN,                // SUN = 0

MON,                // MON = 1;

TUE,

WEN,

THU,

FRI,

SAT,

}week;

(5)定义方法5:用typedef定义枚举类型别名

typedef enum

{

SUN,                // SUN = 0

MON,                // MON = 1;

TUE,

WEN,

THU,

FRI,

SAT,

}week;

注意:

(1)不能有重名的枚举类型

即在一个文件中不能有两个或两个以上的enum被typedef成相同的别名。这很好理解,因为将两种不同类型重命名为相同的别名,这会让gcc在还原别名时遇到困惑。比如你定义了typedef int INT; typedef char INT; 那么INT代表的是int还是char呢?

(2)不能有重名的枚举成员

两个struct类型内的成员名称是可以重名的,而两个enum类型中的成员却不可以重名。因为struct类型成员的访问方式为 变量名.成员,而enum成员的访问方式为 成员名,因此若两个enum类型中有重名的成员,那代码中访问这个成员时到底指的是哪个enum中的成员呢?

但是两个#define宏定义是可以重名的,该宏名真正的值取决于最后一次定义的值。编译器会给出警告但不会error。

单片机c语言中枚举,嵌入式开发-枚举详解---朱有鹏相关推荐

  1. c语言二级指针有什么作用,C语言中二级指针的实例详解

    C语言中二级指针的实例详解 C语言中二级指针的实例详解 用图说明 示例代码: #include int main(int argc, const char * argv[]) { // int a = ...

  2. eclipse配置python开发环境_Eclipse中配置python开发环境详解

    Eclipse中配置python开发环境详解 1.下载python安装包.python-2.6.6.msi.并安装. 默认python会安装在C:\Python26下,查看环境变量,如果没有在path ...

  3. c语言结构体成员变量私有化,C语言中结构体变量私有化详解

    C语言中结构体变量私有化详解 背景介绍 操作系统 : CentOS7.3.1611_x64 gcc版本 :4.8.5 什么是结构体? 在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚 ...

  4. C语言中三个数比较大小详解——三种方法

    ​ C语言中三个数比较大小详解--三种方法 方法一:if-else法 方法二:函数法 方法三:三目运算符法 C语言中比较三个数的大小有很多方法,以下是我总结的三种方法: 首先我定义 int a = 1 ...

  5. c语言自定义color,forecolor c语言中的颜色设置语句详解

    backcolor与forecolor的区别 backcolor:用来设置图像的背景颜色,也用来设置文档.表格.图像等的背景颜色. forecolor:用来设置图像的前景颜色,也用来设置文档.表格.图 ...

  6. c语言输入循环语句,C语言中输入输出和循环语句详解.ppt

    C语言中输入输出和循环语句详解 C语言的输入输和循环分支语句详解 本章主要向大家介绍下C语言的输入和输出功能以及循环分支语句的使用 第4章 顺序结构程序设计 3.1 C语言语句 3.2 赋值语句 3. ...

  7. C语言中的数据类型及其转换详解

    http://www.cnblogs.com/jpcflyer/archive/2012/02/16/2353447.html 1. C语言中的数据类型 C语言中的类型按其组成可以分为简单类型和构造类 ...

  8. c语言实现结构体变量private,C语言中结构体变量私有化详解

    背景介绍 操作系统 : CentOS7.3.1611_x64 gcc版本 :4.8.5 什么是结构体? 在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate ...

  9. C语言中数组的排序算法详解——选择法、冒泡法、交换法、插入法、折半法

    选择法排序 选择法排序是指:如果要把一个数组从小到大排列,那么就从该数组中依次选择最小的数字来排序.从第一个数字开始,将第一个数字与数组中剩下数字中最小的那一个交换位置,然后将第二个数字与剩下数字中最 ...

最新文章

  1. hadoop调用python算法_使用Python实现Hadoop MapReduce程序
  2. 【WPF】MeshGeometry3D中的Normals和TextureCoordinates属性
  3. 第三次作业+105032014101
  4. ASP.NET MVC5+EF6+EasyUI 后台管理系统(63)-WebApi与Unity注入
  5. 让架构更简单,QCon上海2016热点前瞻
  6. HEVC/H265 HM10.0 分析(三)TAppDecTop.cpp
  7. 融云通讯服务器,vue使用融云即时通讯,老是报了发送失败,服务器超时
  8. java 采集 cms_开源 java CMS - FreeCMS2.3 Web页面信息采集
  9. centos6.5卸载和安装mysql_Linux CentOS 6.5 卸载、tar安装MySQL的教程
  10. python字典类型写入文件_python 字典写入文件
  11. Idea和使用git命令上传本地新项目到gitee上
  12. JavaScript基本语法2
  13. 在MATLAB下安装Matpower模块
  14. 命名实体识别难在哪?
  15. LiveZilla 详细 配置 设置 (一) 安装 wamp
  16. 谷歌浏览器二维码识别插件,解决你二维码识别跳转难题
  17. MySQL更新时间的时候生成随机时间
  18. 进程同步机制四大基本准则
  19. 神经网络量化----吐血总结
  20. user.has_perm(perm) 中参数 perm 的格式问题 - Django

热门文章

  1. 获取当前时间和一年后时间(中国标准时间)时间处理
  2. 三国志战略版:奸雄骑,不要奸雄
  3. 基于autojs7的亚丁号点淘辅助
  4. 原力的黑暗面3-恐惧是黑暗之源
  5. 英雄联盟手游登录注册地与服务器不匹配,《lol手游》登录失败解决教程 全错误代码异常解决方法...
  6. 对短视频和技术的一些看法
  7. 1 软件需求的本质(1)
  8. @Before,@After和@BeforeClass和@AfterClass的区别
  9. HackTheBox-baby CachedView
  10. hash值和history值详解区别