12
  • 枚举是“命名的常量集合”: enum MyType_e {A, B, C};
  • 这些常量在枚举的父范围内声明,即如果枚举在文件范围内声明,并且未命名,则相当于一系列 eg#define A 0语句
  • 枚举常量的底层类型总是intieint var = A是完全合法的,虽然var不是类型MyType_e

那么枚举名称的作用是什么?

编辑 根据下面的评论,我对枚举的理解似乎有很大缺陷。枚举与#define 语句无关。 枚举在编译时被解析,并被输入。

4

3 回答 3

8

使用enum类型传达意图。

假设您有一个将enum常量作为参数的函数。

void foo(enum MyType_e e);

是关于什么是有效输入的自我记录,但是:

void foo(int e);

不是。此外,如果您尝试为该enum类型传递不兼容的值,编译器可能会发出警告。来自 ISO C99 规范的附录 I(“常见警告”):

一个实现可能会在许多情况下产生警告......以下是一些更常见的情况。

[...]

  • 为枚举类型的对象赋予值,而不是通过分配作为该类型成员的枚举常量,或具有相同类型的枚举变量,或返回相同枚举类型的函数的值( 6.7.2.2)。

switch如果您在enum类型上使用但忽略处理其所有常量并且没有default大小写,某些编译器(例如 gcc)甚至可能会生成警告。

于 2013-04-15T06:40:58.893 回答
3

虽然你可以完美地说

int var = A

变体

enum mytype var = A

出于文档原因更好。

于 2013-04-15T06:16:58.460 回答
1

上面的答案是好的和正确的,我只想补充一点,某些调试器能够在悬停或监视枚举类型变量时显示枚举名称。这确实有助于清晰,尤其是当枚举用于状态机实现中的状态时。

于 2013-04-19T09:57:45.477 回答