我正在使用gcc并且我编译了这段代码,它应该抛出错误但是它成功运行。
enum DIRECTION {EAST,WEST,NORTH,SOUTH};
int main(void) {
enum DIRECTION currentDirection = 10;
printf("%d\n",currentDirection);
return 0;
}
输出: 10
答案 0 :(得分:4)
枚举类型在C99 draft standard部分6.7.2.2
枚举说明符中定义为:
每个枚举类型应与char,有符号整数类型或者 无符号整数类型。类型的选择是实现定义的, 110) [...]
脚注110
说:
实现可能会延迟选择哪个整数类型,直到看到所有枚举常量。
标准并未说明您不允许在枚举声明中指定的值之外指定值,尽管在Annex I
部分的常见警告中它确实提出了这样的警告但是这不是必需的:
除了通过赋值之外,给予枚举类型的对象赋值 枚举常量,该类型的成员,或具有的枚举对象 相同的类型,或返回相同枚举类型的函数的值(6.7.2.2)。
gcc
不会产生警告,但clang
带有-Wassign-enum
标记或-Weverything
标记,并且它看起来与此类似:
警告:整数常量不在枚举类型的范围内'enum DIRECTION'[-Wassign-enum]
您可以使用-Werror
将其设为错误。
基思提出了两个有趣的观察结果:
-Werror
会导致clang
不符合规定,因为代码有效 C 。enum DIRECTION currentDirection = 128;
具有实现定义的行为,因为类型可能是 char 。答案 1 :(得分:3)
在C中,枚举常量相当于int。您可以互换使用它们。
答案 2 :(得分:0)
enum
(枚举)是一种可以包含用户指定的一组整数值的类型。这是一种为相关值的小列表创建符号名称的方法。他们的目的是使程序更清晰,更易读。
enum
类型的值称为枚举数。枚举器与enum
处于同一范围,它们的值隐式转换为整数。
宏用于预处理器,编译后的代码不知道您创建的宏。在代码到达编译器之前,它们已经被预处理器替换。枚举是一个编译时实体,编译后的代码保留有关该符号的完整信息,该信息在调试器(和其他工具)中可用。
此外,稍后添加新的符号名称并让值自行重新排序也很方便。但是,enum
中的C
不是强类型的,并且与有符号整数兼容。因此,您可以为enum
类型变量分配任何值。
// APPLE == 0, PEARS == 1, ...
enum fruits {APPLE, PEARS, BANANA};
// APPLE == 0, MANGO == 1, PEARS == 2, ...
enum fruits {APPLE, MANGO, PEARS, BANANA};
enum color {APPLE, PEACH};
enum color my_color = MANGO; // not strongly typed
enum fruits my_fruit = 7; // int -> enum fruits conversion
enum
中的C++
是强类型的。
enum class Traffic_light {red, yellow, green};
enum class Warning {green, yellow, orange, red};
Warning w = 1; // error. no int -> Warning implicit conversion
Traffic_light t = Warning::red; // type error. Warning::red is a different type