这是我的代码:
#include <stdio.h>
int main()
{
enum C {green = 5, red};
enum CC {blue, yellow} cc = green;
printf("%i\n", cc);
return 0;
}
它编译并生成控制台输出5.
cppreference.com表示“枚举类型是一种不同的类型,其值仅限于几个显式命名的常量之一(枚举常量)”。我真的很困惑。
顺便说一句,我使用的编译器是gcc版本4.8.1。
答案 0 :(得分:4)
您正在阅读C ++文档以了解C? C和C ++ 不是相同的语言。
在C中,btStop
实际上是一个整数类型,您可以这样处理它。这意味着您可以为其分配一个整数,该整数可能不是规定值之一。
然而,这被认为是不好的做法,而且一些编译器或静态代码检查器可以选择警告这些做法。
另一方面,在C ++中,枚举本身就是不同的类型,你不能在C ++中这样做,至少不是隐式的。将其编译为C ++会导致编译错误。
答案 1 :(得分:3)
从std 6.7.2.3(枚举内容) - enum
的基础类型是实现定义的,但类型enum
的变量可以分配任意数量的基础类型(在至少char
)。
每个枚举类型应与char,有符号整数类型或者 无符号整数类型。 类型的选择是实现定义的,但应该是 能够表示枚举的所有成员的值。该 枚举类型是不完整的,直到终止列表的}之后 枚举器声明,然后完成。
编译器不需要检查enum
变量中的商店是否是该枚举的有效值。
答案 2 :(得分:2)
是的,C编译器允许你这样做。
你也可以这样做:
#include <stdio.h>
int main()
{
enum C {green = 5, red};
enum C cc = 7;
printf("%i\n", cc);
return 0;
}
CPP与C非常不同,因此不要将CPP引用应用于C.
答案 3 :(得分:0)
在C中存在矛盾。所有枚举都是不同的类型。但是它们的枚举器是int
类型的整数常量。
没有检查给定的整数值是否对应于枚举中指定的枚举数集。
在C ++中,矛盾被消除了。在C ++中,每个枚举器都与枚举的枚举类型相同,而且没有从类型int
到给定枚举类型的隐式转换。