是的,这个声明在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。!x等同于x==0。(任何非零值在用作条件时都被视为true,但是!和==运算符等始终产生恰好为0或1的结果。)枚举常量始终是int类型;如果指定了值,则必要时将其转换为int。
(在1999年的标准中,C添加了类型_Bool,但是所有生成逻辑上“布尔”值的运算符仍然生成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++中将是非法的),我不同意。对于熟悉C语言的人来说,常量1
是完全清晰的。将其重写为!false
并不会有帮助。事实上,当<stdbool.h>
不可用时(这种情况现在很少见),我已经使用过:
typedef enum { false, true } bool;
< p >“false”和“true”将被赋予它们正确的值,这一事实显然易见。
< p >至于为什么C99没有使用像这样的“enum”定义,我认为这是因为每个枚举类型与某些实现定义的整数类型兼容。(对于gcc,通常是“unsigned int”或“int”)。委员会希望“_Bool”是一个不同的类型,并且其转换等级低于任何其他整数类型。(而且他们不能使“bool”成为关键字,否则会破坏现有代码。)