©
This document uses PHP Chinese website manual Release
一个枚举类型是独特的类型,它的值是其值基本类型(见下面),其中包括明确命名常数(的值枚举常数)。
枚举类型使用以下枚举说明符作为声明语法中的类型说明符进行声明:
enum identifier(optional) { enumerator-list } |
---|
其中,枚举器列表是逗号分隔的列表(允许使用尾随逗号)(自C99以来)的枚举器,其中每个列表的形式为:
enumerator | (1) | |
---|---|---|
enumerator = constant-expression | (2) |
其中
identifier, enumerator | - | identifiers that are introduced by this declaration |
---|---|---|
constant-expression | - | integer constant expression whose value is representable as a value of type int |
与结构体或联合体一样,引入枚举类型和一个或多个枚举常量的声明也可以声明该类型或类型的一个或多个对象。
enum color_t {RED, GREEN, BLUE}, c = RED, *cp = &c; // introduces the type enum color_t // the integer constants RED, GREEN, BLUE // the object c of type enum color_t // the object cp of type pointer to enum color_t
每个出现在枚举说明符主体中的枚举器都会成为一个int
在封闭范围内具有类型的整数常量,并且可以在需要整数常量时使用(例如,作为 case 标签或非 VLA 数组大小)。
enum color_t { RED, GREEN, BLUE} r = RED;switch(r) { case RED : puts("red"); break; case GREEN : puts("green"); break; case BLUE : puts("blue"); break;}
如果枚举器后跟=常量表达式,则其值是该常量表达式的值。如果枚举器后面没有= constant-expression,那么它的值是比同一个枚举中前一个枚举器的值大1的值。第一个枚举器的值(如果它不使用= constant-expression)为零。
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_t { RED, GREEN, BLUE};enum color_t r = RED; // OK// color_t x = GREEN: // Error: color_t is not in ordinary name spacetypedef enum color_t color;color x = GREEN; // OK
每个枚举类型与下列之一兼容:char
有符号整数类型或无符号整数类型。它是实现定义的,哪种类型与任何给定枚举类型兼容,但无论它是什么,它必须能够表示该枚举的所有枚举值。
枚举类型是整数类型,因此可以在其他整数类型可以使用的任何位置使用,包括隐式转换和算术运算符。
enum { ONE = 1, TWO } e;long n = ONE; // promotiondouble d = ONE; // conversione = 1.2; // conversion, e is now ONEe = e + 1; // e is now TWO
与 struct 或 union 不同,C 中没有前向声明的枚举:
enum Color; // Error: no forward-declarations for enums in Cenum Color { RED, GREEN, BLUE};
枚举允许以比其更方便和结构化的方式声明命名常量#define
; 它们在调试器中可见,遵守范围规则并参与类型系统。
#define TEN 10struct S { int x : TEN; }; // OK
或者
enum { TEN = 10 };struct S { int x : TEN; }; // also OK
C11 standard (ISO/IEC 9899:2011):
6.2.5/16 Types (p: 41)
6.7.2.2 Enumeration specifiers (p: 117-118)
C99 standard (ISO/IEC 9899:1999):
6.2.5/16 Types (p: 35)
6.7.2.2 Enumeration specifiers (p: 105-106)
C89/C90 standard (ISO/IEC 9899:1990):
3.1.2.5 Types
3.5.2.2 Enumeration specifiers
enum
.