枚举
枚举类型是一种独特的类型,其值是其底层类型(见下文)的值,其中包括显式命名的常量(枚举常量)的值。
内容 |
[编辑] 语法
枚举类型使用以下枚举说明符在声明语法中作为类型说明符来声明。
enum attr-spec-seq (可选) 标识符 (可选) { 枚举器列表 } |
(1) | ||||||||
enum attr-spec-seq (可选) 标识符 (可选) : 类型 { 枚举器列表 } |
(2) | (自 C23 起) | |||||||
其中 枚举器列表 是一个以逗号分隔的 (允许尾部逗号)(自 C99 起) 枚举器 列表,每个枚举器都具有以下形式:
枚举常量 attr-spec-seq (可选) | (1) | ||||||||
枚举常量 attr-spec-seq (可选) = 常量表达式 |
(2) | ||||||||
其中
标识符,枚举常量 | - | 此声明引入的标识符 |
常量表达式 | - | 整数常量表达式 其值为类型 int 可表示的(直到 C23)。 如果枚举有固定底层类型,则可表示为 类型 的值(自 C23 起) |
attr-spec-seq | - | (C23)可选的属性列表,
|
与结构体或联合体类似,引入枚举类型和一个或多个枚举常量的声明也可以声明该类型或派生自该类型的类型的一个或多个对象。
enum color { RED, GREEN, BLUE } c = RED, *cp = &c; // introduces the type enum color // the integer constants RED, GREEN, BLUE // the object c of type enum color // the object cp of type pointer to enum color
[编辑] 解释
出现在枚举说明符主体中的每个 枚举常量 都成为封闭作用域中的整数常量 其类型为 int(直到 C23),可以在需要整数常量的地方使用(例如,作为情况标签或作为非可变长数组大小)。
在处理枚举器列表中的每个枚举常量期间,枚举常量的类型应为
如果先前枚举常量为带符号整数类型,则选择带符号整数类型。如果先前枚举常量为无符号整数类型,则选择无符号整数类型。如果没有先前描述的大小合适的整数类型能够表示新值,则枚举将没有能够表示其所有值的类型。 |
(自 C23 起) |
如果 枚举常量 后面跟着 = 常量表达式,则其值为该常量表达式的值。如果 枚举常量 后面没有跟着 = 常量表达式,则其值为同一个枚举中前一个枚举器的值加 1。第一个枚举器的值(如果它不使用 = 常量表达式)为零。
enum Foo { A, B, C = 10, D, E = 1, F, G = F + C }; // A=0, B=1, C=10, D=11, E=1, F=2, G=12
如果使用,则 标识符 本身将成为标签命名空间 中枚举类型的名称,并且需要使用关键字 enum(除非被 typedef 到普通命名空间中)。
enum color { RED, GREEN, BLUE }; enum color r = RED; // OK // color x = GREEN; // Error: color is not in ordinary name space typedef enum color color_t; color_t x = GREEN; // OK
每个枚举类型 没有固定底层类型(自 C23 起) 与以下类型之一兼容:char,带符号整数类型,或无符号整数类型 (不包括 bool 和位精确整数类型)(自 C23 起)。哪种类型与给定枚举类型兼容是实现定义的,但无论是什么,它都必须能够表示该枚举的所有枚举器值。 对于所有具有固定底层类型的枚举,枚举类型与其底层类型兼容。(自 C23 起)
没有固定底层类型的枚举类型的枚举成员类型在完成时为
|
(自 C23 起) |
所有枚举都有底层类型。可以使用枚举类型说明符显式指定底层类型,它是其固定底层类型。如果未显式指定,则底层类型为枚举的兼容类型,即带符号或无符号整数类型,或 char。 | (自 C23 起) |
枚举类型是整数类型,因此可以在其他整数类型可以使用的地方使用,包括隐式转换和算术运算符中。
enum { ONE = 1, TWO } e; long n = ONE; // promotion double d = ONE; // conversion e = 1.2; // conversion, e is now ONE e = e + 1; // e is now TWO
[编辑] 注释
enum Color; // Error: no forward-declarations for enums in C enum Color { RED, GREEN, BLUE };
与 #define 相比,枚举允许以更方便和结构化的方式声明命名常量;它们在调试器中可见,遵守作用域规则,并参与类型系统。
#define TEN 10 struct S { int x : TEN; }; // OK
或者
enum { TEN = 10 }; struct S { int x : TEN; }; // also OK
自 C23 起,constexpr 可以用于相同目的。
constexpr int TEN = 10; struct S { int x : TEN; }; // also OK
此外,由于结构体或联合体在 C 中不建立其作用域,因此可以在前者的成员说明符中引入枚举类型及其枚举常量,并且它们的作用域与前者相同,之后。
struct Element { int z; enum State { SOLID, LIQUID, GAS, PLASMA } state; } oxygen = { 8, GAS }; // type enum State and its enumeration constants stay visible here, e.g. void foo(void) { enum State e = LIQUID; // OK printf("%d %d %d ", e, oxygen.state, PLASMA); // prints 1 2 3 }
[编辑] 示例
输出
List of cable stations: FOX: 11 HBO: 22 MAX: 30
[编辑] 参考资料
- C23 标准 (ISO/IEC 9899:2024)
- 6.2.5/21 类型 (p: 39)
- 6.7.2.2 枚举说明符 (p: 107-112)
- C17 标准 (ISO/IEC 9899:2018)
- 6.2.5/16 类型 (p: 32)
- 6.7.2.2 枚举说明符 (p: 84-85)
- C11 标准 (ISO/IEC 9899:2011)
- 6.2.5/16 类型 (p: 41)
- 6.7.2.2 枚举说明符 (p: 117-118)
- C99 标准 (ISO/IEC 9899:1999)
- 6.2.5/16 类型 (p: 35)
- 6.7.2.2 枚举说明符 (p: 105-106)
- C89/C90 标准 (ISO/IEC 9899:1990)
- 3.1.2.5 类型
- 3.5.2.2 枚举说明符
[编辑] 关键字
[编辑] 参见
C++ 文档 用于 枚举声明
|