为什么C编译器没有检查枚举?

时间:2011-09-15 13:23:48

标签: c compiler-construction enums

以下文字摘自 C Programming Language, 2nd Edition ,由C语言的创建者撰写(所以我认为它是正确的):

  

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

我有些疑惑:

  1. 对于C语言中的哪些情况,编译器不会检查enum
  2. 的值 由于某种原因,未检查
  3. enum常量。为什么不?原因是什么?
  4. 由于编译器未检查enum,使用enum是否容易出错?请解释一下。

3 个答案:

答案 0 :(得分:8)

  1. 枚举就像一个花哨的整数,并且它比定义整个加载的常量或预处理器宏作为你想要存储的常量值的名称更好,因为编译器(或编辑器)可以< / em>检查您是否使用正确的名称和值来使用正确的类型。另一方面,只是一个int,没有什么可以阻止你输入一个你没有命名的值,这偶尔会有用。

  2. 在每种情况下都无法检查它们。如果将两个数字相加以获得将放入枚举类型变量中的值,该怎么办?它可以是在运行时生成的任何值,因此无法检查(至少没有大量开销)。

  3. C中的所有内容都不安全;几乎没有编译器可以完全阻止你滥用的功能。枚举是安全的,因为它们可以有效地防止程序员错误和混乱,而不是因为它们阻止你做一些愚蠢的事情。

答案 1 :(得分:6)

你可以做一个像

这样的枚举
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 */
};

然后定义该类型的对象

enum status status;

并将其设置为某些“简单”状态的按位OR

status = ST_WAIT | ST_ERROR; /* recoverable error */

请注意,值ST_WAIT | ST_ERROR6且该值不是枚举的一部分。


回答你的问题:

  1. C编译器让程序员用脚射击自己。
  2. C编译器让程序员用脚射击自己。
  3. C编译器让程序员用脚射击自己。

答案 2 :(得分:1)

  

1)在C语言的所有情况下,编译器都不会像枚举那样检查值。

我不能不理解你的部落说话。

  

1)在C语言的所有情况下,编译器都不会检查枚举的值。 [编辑]

分配给它时。允许使用裸整数进行赋值,因此您可以执行以下操作:

enum E { A, B } x;
x = 10000;

没有编译器错误。此外,枚举中的switch es不会检查详尽无遗。

  

2)为什么不检查枚举常量,原因有哪些?这些原因是什么?

人们喜欢将整数放入其中。例如

enum E { END_OF_EVERYTHING = 5 };

其中0-4表示普通值,5表示特殊值。

  

3)由于编译器未检查枚举,因此使用枚举容易出错?

是。由于枚举只有可以获取所有枚举值的最少位数的值,因此可能会得到奇怪的结果:

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

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