CAPL 编程系列教程的第七期内容,主要讲解 CAPL 中的另一种复合数据类型:枚举 (Enumeration),关键字为 enum
CAPL 编程系列教程 - 第七期:复合数据类型之枚举 (enum)
一、 课程回顾与本期目标
二、 枚举 (enum) 的基本概念
- 定义: 枚举用于定义一组有限的、可以一一列举的命名常量 (Named Constants)
。它本质上是将一组有意义的名字与整数值关联起来。 - 作用:
- 提高代码的可读性和可维护性:使用有意义的名称(如
Monday,Male,East)代替难以理解的魔法数字(如 0, 1, 2)。 - 限制变量的取值范围:如果将变量声明为枚举类型,可以(在一定程度上)限制其只能赋予该枚举定义的常量值,增加类型安全性
。
- 提高代码的可读性和可维护性:使用有意义的名称(如
- 唯一性: 在整个 CAPL 程序(通常指一个
.can文件或相关联的文件)中,所有定义的枚举常量的名称必须是唯一的。
三、 定义枚举类型 (Defining an Enum Type)
- 语法:
Code snippet
enum TypeName { CONSTANT_NAME_1, CONSTANT_NAME_2, CONSTANT_NAME_3 = value3, // 可以指定值 // ... more constants }; // <-- 注意末尾的分号 - 关键字: 使用
enum关键字开始定义。 - 类型名称 (TypeName): 自定义的枚举类型的名字(如
Direction,Gender,Weekday)。 - 枚举常量 (Enumerators/Constants):
- 在花括号
{}内定义枚举包含的常量名称,多个常量之间用逗号,分隔。 - 常量名直接书写,不加引号
。 - 默认整数值: 如果不显式指定,第一个枚举常量的值默认为 0,后续常量的值依次递增 1
。 - 指定整数值: 可以在常量名后使用
= value为其指定一个具体的整数值。后续未指定值的常量会从上一个指定值的基础上递增 1。
- 在花括号
- 末尾分号: 整个枚举类型定义结束后,必须在右花括号
}后面加上一个分号;。 - 示例:
Code snippet
enum Direction { East, South, West, North }; // East=0, South=1, West=2, North=3 enum Gender { Male, Female }; // Male=0, Female=1 enum Weekday { Monday=1, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday }; // Monday=1, Tuesday=2, ..., Sunday=7 - 重要: 这个步骤仅仅是定义了一种新的枚举类型和其中的常量,并没有创建任何变量
。
四、 使用枚举常量
- 直接使用: 定义枚举类型后,其中的枚举常量(如
Male,Female,Monday,East)就可以在代码中直接使用。 - 获取整数值: 枚举常量本身就代表其对应的整数值。可以直接用于需要整数的地方
。 - 示例:
write("男的值: %d", Male);// 输出 0
- 示例:
- 参与运算: 可以将枚举常量当作整数进行算术运算
。 - 示例:
write("Male + 5 = %d", Male + 5);// 输出 5 (因为 Male 是 0)
- 示例:
- 提高可读性: 在需要使用特定含义的整数时,用枚举常量代替数字。
- 示例 (不推荐):
int zhangwujiSex = 0; int zhaominSex = 1;// 0 和 1 含义不清 - 示例 (推荐):
int zhangwujiSex = Male; int zhaominSex = Female;// 可读性更好
- 示例 (不推荐):
- 获取常量名称 (重要技巧):
- 语法:
EnumConstant.name() - 可以通过
枚举常量名.name()(注意name后面有小括号()) 的方式获取该常量名称的字符串形式。 - 示例:
write("常量名: %s", Male.name());// 输出字符串 "Male"
- 语法:
五、 声明枚举变量 (Declaring Enum Variables)
- 先定义类型,后声明变量 (推荐):
- 语法:
enum TypeName variableName; - 必须先定义好枚举类型
TypeName。 - 然后使用
enum 已定义的类型名 变量名;来声明该枚举类型的变量。 - 示例:
enum Gender zhangwujiSex;
- 语法:
- 赋值:
- 声明为枚举类型的变量,应该赋予该枚举类型中定义的常量值
。 - 示例:
zhangwujiSex = Male; - 类型检查: 直接赋予普通整数(如
0,1)给枚举类型变量,CAPL 会提示类型不匹配,增强了类型安全。
- 声明为枚举类型的变量,应该赋予该枚举类型中定义的常量值
- 使用枚举变量:
- 可以像使用枚举常量一样使用枚举变量。
- 示例:
write("张无忌性别值: %d, 名称: %s", zhangwujiSex, zhangwujiSex.name());// 输出 0, "Male"
- 定义类型的同时声明变量:
- 语法:
enum TypeName { ... } variableName1 = value1, variableName2 = value2, ...; - 在枚举类型定义的右花括号
}和末尾分号;之间,直接写上要声明的变量名,并可以同时赋初值。 - 示例:
enum Direction { ... } cdDir = West, bjDir = North;
- 语法:
- 定义匿名枚举并声明变量:
- 语法:
enum { CONSTANT_1, ... } variableName1 = CONSTANT_1, ...; - 在定义枚举时省略类型名称,直接在花括号和分号之间声明变量
。 - 缺点: 无法在其他地方再次使用这个(未命名的)枚举类型来声明新的变量
。 - 示例:
enum { Red, Green, Blue } c1 = Red, c2 = Blue;
- 语法:
六、 枚举与 DBC 文件
- DBC 文件中的值表 (Value Table) 功能,可以将信号的特定数值与描述性文本关联起来,其作用和实现方式类似于枚举
。后续用到会再提及。
七、 总结与后续
- 本期学习了 CAPL 中的枚举类型 (
enum),它用于定义一组有名字的整数常量,能显著提高代码可读性。 - 掌握了定义枚举类型、声明枚举变量、使用枚举常量及其名称的方法
。 - 至此,已学习了 CAPL 的简单数据类型以及三种复合数据类型:数组、结构、枚举
。 - 后续课程将继续深入 CAPL 编程的其他方面。