C中的枚举不会在无效输入上引发错误

时间:2014-02-10 16:56:35

标签: c enums

我正在使用gcc并且我编译了这段代码,它应该抛出错误但是它成功运行。

enum DIRECTION {EAST,WEST,NORTH,SOUTH};

int main(void) {
    enum DIRECTION currentDirection = 10;
    printf("%d\n",currentDirection);
    return 0;
}

输出: 10

3 个答案:

答案 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