C语言可以通过两种方式定义常量:
1.#define宏定义
2.enum枚举定义
使用#define宏定义的缺点是,其属于预编译阶段常量,其名字会被预编译器替换为数值,这样在编译阶段,其名字已经不会再出现。
只用enum枚举定义,其名字在编译阶段依然是可见的。
定义枚举常量的方式为:
enum Color{red, green, blue};
其中枚举类型名Color是可选的。
在没有为枚举常量设置值时
,枚举类型中的第一个枚举常量
的值为0,第二个为1,以此类推。
如果指定了枚举常量
的值,那么后续枚举常量
的值依次加1.
- #include
-
- int main()
- {
- enum Color{red, yellow, green=5, blue, white=1 };
- printf("%d %d %d %d %d\n", red, yellow, green, blue, white);
- return 0;
- }
运行程序输出:
0 1 5 6 1
red,由于没有被设置值,因此默认值为0
yellow,基于red加1,值为1
green,被指定了值,值为5
blue,基于green加1,值为6
white,被指定了值,值为1
需要注意的是,枚举常量一旦被初始化后,其值是不能被更改的,也正因为如此才被称为枚举常量。
可以通过如下方式定义枚举变量:
- #include
-
- int main()
- {
- enum Color{red, yellow, green=5, blue, white=1 };
- enum Color c1 = green;
- enum Color c2 = (Color)9; //不能直接用整数为枚举变量赋值
- printf("%d %d\n", c1, c2);
- return 0;
- }
运行程序输出:
5 9
c1,枚举变量被定义为green,值为5
c2,枚举变量被定义了一个不存在的枚举值,值为9
另外需要注意的是,不能在同一个作用域内定义相同名字的枚举常量,即使这些常量位于不同的枚举类型名:
- #include
-
- int main()
- {
- enum Color{red, yellow, green=5, blue, white=8 };
- enum Wine{red, white};
- printf("%d %d %d\n", red, white, blue);
- return 0;
- }
编译错误:
error: 'red' conflicts with a previous declaration
error: 'white' conflicts with a previous declaration
在不同的作用域内定义的枚举常量,相同名字的枚举常量会被掩盖:
- #include
-
- enum Color{red, yellow, green=5, blue, white=8 };
- int main()
- {
- enum Wine{red, white};
- printf("%d %d %d\n", red, white, blue);
- return 0;
- }
运行程序输出:
0 1 6
Wine内定义的red和white与Color定义的red和white具有相同的枚举常量名,但由于定义在不同的作用域内,因此Wine的局部作用域red和white掩盖了全局作用域内的Color的red和white
但是Wine没有定义blue,所以blue的值依然为全局作用域Color定义的枚举常量
通过以上几个程序可以看到,枚举在使用时有几点异于常规:
1.枚举的常量值,不需要通过其枚举常量名,可以直接使用
2.不同的枚举常量可以拥有相同的值
3.枚举变量可以被赋值一个不存在的枚举常量值
4.在相同作用域内的枚举名不能重复
对于这些不足,C++11引入了枚举类,可以更好的使用枚举