为什么不是';C编译器没有检查枚举吗?

为什么不是';C编译器没有检查枚举吗?,c,compiler-construction,enums,C,Compiler Construction,Enums,下面的文本是C语言的创建者所写的一段摘录(因此我认为它是正确的): 尽管可以声明枚举类型的变量,但编译器无需检查存储在此类变量中的内容是否是枚举的有效值 我有一些疑问: 对于C语言中的哪些情况,编译器不检查enum的值 enum由于某些原因,未检查常量。为什么不呢?原因是什么 由于编译器未检查enum,因此使用enum是否容易出错?请解释一下 您可以像这样进行枚举 enum status { ST_READY = 1 << 0, /* 1 */ ST_WAIT =

下面的文本是C语言的创建者所写的一段摘录(因此我认为它是正确的):

尽管可以声明枚举类型的变量,但编译器无需检查存储在此类变量中的内容是否是枚举的有效值

我有一些疑问:

  • 对于C语言中的哪些情况,编译器不检查
    enum
    的值
  • enum
    由于某些原因,未检查常量。为什么不呢?原因是什么
  • 由于编译器未检查
    enum
    ,因此使用
    enum
    是否容易出错?请解释一下
  • 您可以像这样进行枚举

    enum status {
        ST_READY = 1 << 0, /*  1 */
        ST_WAIT  = 1 << 1, /*  2 */
        ST_ERROR = 1 << 2, /*  4 */
        ST_HALT  = 1 << 3, /*  8 */
        ST_ETC   = 1 << 4, /* 16 */
    };
    
    并将其设置为按位或某些“简单”状态

    status = ST_WAIT | ST_ERROR; /* recoverable error */
    
    请注意,值
    ST|u WAIT | ST_ERROR
    6
    ,并且该值不是枚举的一部分


    回答您的问题:

  • C编译器让程序员自食其果
  • C编译器让程序员自食其果
  • C编译器让程序员自食其果
  • 枚举就像一个奇特的整数,它比定义一整堆常量或预处理器宏作为要存储的常量值的名称要好,因为编译器(或编辑器)可以检查您是否使用了正确的名称和值来匹配正确的类型。另一方面,作为一个int,没有什么能阻止你输入一个你没有命名的值,这有时是有用的

  • 它们不可能在所有情况下都被检查。如果将两个数字相加,得到要放入枚举类型变量中的值,会怎么样?它可以是运行时生成的任何值,因此无法进行检查(至少不会有很多开销)

  • C语言中的一切都是不安全的;实际上,编译器没有任何功能可以完全防止您滥用。枚举之所以安全,是因为它们能够有效地防止程序员错误和混乱,而不是因为它们阻止您做一些愚蠢的事情

  • 在C语言的所有情况下,编译器都不会检查枚举的值。[已编辑]
  • 当您分配给它时。允许从裸整数赋值,因此您可以执行以下操作:

    enum E { A, B } x;
    x = 10000;
    
    没有编译器错误。此外,枚举中的
    开关
    不检查穷举性

    2) 出于某些原因,为什么不检查枚举常量?这些原因是什么

    人们喜欢把整数放进去。例如

    enum E { END_OF_EVERYTHING = 5 };
    
    其中0-4表示普通值,5表示特殊值

  • 因为编译器没有检查枚举,所以使用枚举容易出错
  • 对。由于枚举只有可以接受所有枚举值的最少位数的值,因此可能会得到奇怪的结果:

    enum E { A = 1, B = -1 };
    

    此枚举仅包含2位数据(值-2、-1、0、1)。如果你给它赋值10000,奇怪的事情可能会发生(实际看到)。

    +1c只是假设你知道自己在做什么,并让你以尽可能有效的方式处理它——还有:g/foot/s//head/@asc99c:我会像
    :%s/foot/head/g
    @pmg你能说
    1@Ant's:任何向左(或向右)移动的值吗
    0
    位是初始值本身。我只是将它用于其他行的simmetry。有人认为这是/questions/432937/net的副本。为什么不检查枚举范围值。他们可能改变了主意(答案是一样的,但问题毕竟是关于一种不同的语言),但不可能取消投票。enum
    s的另一个好处是,如果有一个
    开关
    块打开
    enum
    ,一些编译器会警告您,在代码> >代码>子句中留下一个。对于一些编译器,我认为这是一个恼人的事情,而不是关于<代码> EnUM<代码>的一件大事。很有可能,甚至很有可能,由于先前的逻辑排除了其他值,某个
    开关
    只处理可能的
    enum
    值的子集…@R..:在这种情况下,您只需添加
    default:/*error handlign code*/
    以使警告静音,你怎么能说这些值是-2,-1,0,1?
    enum E { A = 1, B = -1 };