单片机c语言中枚举,嵌入式开发-枚举详解---朱有鹏
嵌入式开发-枚举详解
朱有鹏
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语言中枚举,嵌入式开发-枚举详解---朱有鹏相关推荐
- c语言二级指针有什么作用,C语言中二级指针的实例详解
C语言中二级指针的实例详解 C语言中二级指针的实例详解 用图说明 示例代码: #include int main(int argc, const char * argv[]) { // int a = ...
- eclipse配置python开发环境_Eclipse中配置python开发环境详解
Eclipse中配置python开发环境详解 1.下载python安装包.python-2.6.6.msi.并安装. 默认python会安装在C:\Python26下,查看环境变量,如果没有在path ...
- c语言结构体成员变量私有化,C语言中结构体变量私有化详解
C语言中结构体变量私有化详解 背景介绍 操作系统 : CentOS7.3.1611_x64 gcc版本 :4.8.5 什么是结构体? 在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚 ...
- C语言中三个数比较大小详解——三种方法
C语言中三个数比较大小详解--三种方法 方法一:if-else法 方法二:函数法 方法三:三目运算符法 C语言中比较三个数的大小有很多方法,以下是我总结的三种方法: 首先我定义 int a = 1 ...
- c语言自定义color,forecolor c语言中的颜色设置语句详解
backcolor与forecolor的区别 backcolor:用来设置图像的背景颜色,也用来设置文档.表格.图像等的背景颜色. forecolor:用来设置图像的前景颜色,也用来设置文档.表格.图 ...
- c语言输入循环语句,C语言中输入输出和循环语句详解.ppt
C语言中输入输出和循环语句详解 C语言的输入输和循环分支语句详解 本章主要向大家介绍下C语言的输入和输出功能以及循环分支语句的使用 第4章 顺序结构程序设计 3.1 C语言语句 3.2 赋值语句 3. ...
- C语言中的数据类型及其转换详解
http://www.cnblogs.com/jpcflyer/archive/2012/02/16/2353447.html 1. C语言中的数据类型 C语言中的类型按其组成可以分为简单类型和构造类 ...
- c语言实现结构体变量private,C语言中结构体变量私有化详解
背景介绍 操作系统 : CentOS7.3.1611_x64 gcc版本 :4.8.5 什么是结构体? 在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate ...
- C语言中数组的排序算法详解——选择法、冒泡法、交换法、插入法、折半法
选择法排序 选择法排序是指:如果要把一个数组从小到大排列,那么就从该数组中依次选择最小的数字来排序.从第一个数字开始,将第一个数字与数组中剩下数字中最小的那一个交换位置,然后将第二个数字与剩下数字中最 ...
最新文章
- hadoop调用python算法_使用Python实现Hadoop MapReduce程序
- 【WPF】MeshGeometry3D中的Normals和TextureCoordinates属性
- 第三次作业+105032014101
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(63)-WebApi与Unity注入
- 让架构更简单,QCon上海2016热点前瞻
- HEVC/H265 HM10.0 分析(三)TAppDecTop.cpp
- 融云通讯服务器,vue使用融云即时通讯,老是报了发送失败,服务器超时
- java 采集 cms_开源 java CMS - FreeCMS2.3 Web页面信息采集
- centos6.5卸载和安装mysql_Linux CentOS 6.5 卸载、tar安装MySQL的教程
- python字典类型写入文件_python 字典写入文件
- Idea和使用git命令上传本地新项目到gitee上
- JavaScript基本语法2
- 在MATLAB下安装Matpower模块
- 命名实体识别难在哪?
- LiveZilla 详细 配置 设置 (一) 安装 wamp
- 谷歌浏览器二维码识别插件,解决你二维码识别跳转难题
- MySQL更新时间的时候生成随机时间
- 进程同步机制四大基本准则
- 神经网络量化----吐血总结
- user.has_perm(perm) 中参数 perm 的格式问题 - Django
热门文章
- 获取当前时间和一年后时间(中国标准时间)时间处理
- 三国志战略版:奸雄骑,不要奸雄
- 基于autojs7的亚丁号点淘辅助
- 原力的黑暗面3-恐惧是黑暗之源
- 英雄联盟手游登录注册地与服务器不匹配,《lol手游》登录失败解决教程 全错误代码异常解决方法...
- 对短视频和技术的一些看法
- 1 软件需求的本质(1)
- @Before,@After和@BeforeClass和@AfterClass的区别
- HackTheBox-baby CachedView
- hash值和history值详解区别