【发布时间】:2013-04-15 06:14:55
【问题描述】:
- 枚举是“命名的常量集合”:
enum MyType_e {A, B, C}; - 这些常量在枚举的父范围内声明,即如果枚举在文件范围内声明,并且未命名,则相当于一系列例如
#define A 0语句 - 枚举常量的底层类型总是
int,即int var = A是完全合法的,虽然var不是MyType_e类型
那么枚举 name 的用途是什么?
编辑 根据下面的 cmets,我对枚举的理解似乎存在很大缺陷。 枚举与#define 语句无关。 Enums are resolved at compile time,并且是类型化的。
【问题讨论】:
-
您能指出您从中获得这些想法的 C 标准部分吗? C 没有名称空间(至少在我认为您在这里所指的意义上),枚举的底层类型也不总是 int。还是来自较新的 C 标准?
-
@Anonymous:C99 标准的 6.7.2.2/3 表示“枚举器列表中的标识符被声明为类型为
int... 的常量”。不过,这有点令人困惑,因为它后来继续说,“每个枚举类型都应与char、有符号整数类型或无符号整数类型兼容。类型的选择是实现定义的...... ." 所以常量本身是int,但enum类型本身可能不是。通过“命名空间”,我认为 Vorac 的意思是“范围”。 -
@jamesdlin,匿名:我将问题修改为不那么不正确。枚举的依赖于实现的类型对我来说是新闻。很有趣。
-
"这些常量...父作用域...并且未命名,是等价的。" “是”应该是“如果”吗?什么是未命名的范围?我认为问题是关于 C++ 而不是 C 中的枚举,并且将“命名空间”更正为“范围”是一个错误。
-
另外,我不明白枚举等同于一系列
#define语句的意义。这个问题有很多赞成票,但它包含根本错误的假设。