因此,通常枚举用于将“常量整数”组声明为另一种类型,代表某种东西。例如。
enum Color {RED=0, BLUE, YELLOW};
这很清楚。但最近我在代码中遇到了以下内容。这是嵌入式系统的编译器。
enum State {DISABLED=0, ENABLED=!DISABLED};
它运作得很好。它表现为布尔类型。我的问题是,它(这种语法)是否符合ANSI标准?
如果它符合标准,那么为什么编译器会在内部定义像_Bool这样的布尔表示然后在 stdbool.h
(对于C语言)他们这样做:
#define bool _Bool
... // here goes definitions of true and false
代替
enum bool {false=0, true=!false};
哪个更干净?
是的,声明在C和C ++中完全有效且可移植。
在C和C ++中,这个:
enum State {DISABLED=0, ENABLED=!DISABLED};
完全等同于:
enum State {DISABLED=0, ENABLED=1};
对此:
enum State {DISABLED, ENABLED};
但出于不同的原因。
在C,一元 !
运算符产生类型的结果 int
,有价值的 0
(如果操作数不等于 0
) 要么 1
(如果操作数等于 0
)。 !x
相当于 x == 0
。 (当用作条件时,任何非零值都被视为true,但是 !
和 ==
运营商,总是产生精确的结果 0
要么 1
。)枚举常量总是类型 int
;如果指定了值,则将其转换为 int
如有必要。
(C添加类型 _Bool
在1999年的标准中,但是所有产生逻辑“布尔”值的运算符仍然会产生类型的结果 int
。)
在C ++中,一元的结果 !
运算符是类型 bool
。结果是 false
要么 true
C的地方 !
运营商会屈服 0
要么 1
, 分别。与在C中一样,如果指定了值,则根据需要进行转换;该 bool
值 false
和 true
转换成 0
和 1
, 分别。
在C中,枚举常量始终是类型 int
。在C ++中,在这种情况下,它们是枚举类型 enum State
。
在同一类型声明中引用较早的枚举常量是合法的。每个枚举常量在声明后变为可见。
至于像这样的东西:
enum bool { false = 0, true = !false );
更清楚
enum bool { false = 0, true = 1 };
(在C中;它在C ++中是非法的),我恭敬地不同意。常数 1
对任何熟悉C的人都非常清楚。将其重写为 !false
没用实际上,何时 <stdbool.h>
不可用(这些日子很少见),我用过:
typedef enum { false, true } bool;
这个事实 false
和 true
将给出他们正确的值是恕我直言,足够明显。
至于为什么C99没有使用 enum
这样的定义,我怀疑是因为每个枚举类型都与某些实现定义的整数类型兼容。 (对于gcc,它通常是 unsigned int
要么 int
。)委员会希望 _Bool
转换等级低于任何其他整数类型的独特类型。 (他们无法做到 bool
关键字而不破坏现有代码。)
是的,这符合标准。
!DISABLED
是有效的 不变 表达式,这是一个必需的 enum
值。
enum State {DISABLED=0, ENABLED= (!DISABLED)};
// ^^^^^^^^^^^
在那里 DISABLED
引用时,编译器知道它的值,因此它可以计算从它派生的表达式的值,即 !DISABLED
。这是一种奇特的写作方式 ENABLED=1
。
根据C标准(6.2.1标识符范围)
每个枚举常量的范围都在...之后开始
枚举器列表中定义的枚举器的外观
这在C ++中是有效的(3.3.2声明点)
5普查员的声明点紧随其后
枚举器定义。[例如:
const int x = 12;
{ enum { x = x }; }
这里,枚举器x用常量的值初始化
x,即12.-末端示例]
因此,您可以在枚举中的下一个枚举数的定义中使用已定义的枚举器。
至于C型 _Bool
然后它出现在C 99中。在此标准之前,在C中使用了显式常量或枚举。
定义这样的枚举是没有意义的
enum bool {false=0, true!=false};
因为类型 _Bool
已经有两个值0和1。