枚举类型定义,给定一个值

11

使用gcc C99进行编译

我已经使用枚举类型一段时间了。然而,我正在使用一些示例代码开发我的应用程序。我遇到了像这样的一些代码。 我被告知这是使用枚举类型时最佳实践。但我不知道这有什么优势。

typedef enum {
    TYPE_DATE,
    TYPE_TIME,
    TYPE_MONEY,

    TYPE_COUNT,
    TYPE_UNKNOWN = TYPE_COUNT
} string_type_e;

为什么要有TYPE_COUNT,而且为什么要将TYPE_COUNT赋值给TYPE_UNKNOWN

非常感谢任何建议。

4个回答

17

默认情况下,编译器会自动为枚举类型赋予从0开始的整数值。因此,date的值是零,time的值是一,money的值是二。下一个值分配给“伪”枚举值TYPE_COUNT,它将被赋予值三,这恰好是“proper”枚举值的数量。

TYPE_UNKNOWN是另一个值,表示不是“proper”值的内容,所以会失败测试e < TYPE_COUNT。将其设为TYPE_COUNT意味着每个不同的有意义的值都是连续的,但我不知道任何重要优势(如果TYPE_COUNT比2的幂小1,那么可能会影响编译器可以使用的表示形式,而且让值连续很好,但这并不重要,因为您不会将它们增加到TYPE_COUNT之外)


我能否将值0x2和0xfffe分配给枚举中的命名常量? - Namratha
1
@Namratha,你可以这样做,当有一些协议的值被作为与另一个组件接口的一部分而固定时,这是非常常见的。在这种情况下,你可能不会在末尾使用TYPE_COUNT这样的东西,因为除非这些值是连续的,否则你将无法对它们进行计数。 - Pete Kirkham

6

枚举值基本上是整数常量。默认情况下,它们被赋予枚举中最后一个元素的值+1(第一个元素为0)。如果您想要计算这些元素的数量,这可能对将其与数组或其他内容进行映射很有用,则可以在其末尾放置COUNT常量(例如您的示例中的TYPE_COUNT),以便动态更新。为了能够区分枚举中的无效值,您可能希望声明另一个常量。在您的示例中,该常量将等于计数常量,即大于枚举的最大值的一个值。


3

type_count的作用是什么?为什么将type_count分配给type_unknown?

为了掌握enum允许的最大值。请记住,否则将没有办法检查给定值是否正确(在范围内)。


但是在枚举的范围内可能存在间隙和重叠 - 当然不是在这个例子中,而是在一般的枚举中。 - Jonathan Leffler
@Jonathan:如果作者在设计一个底层序列中存在间隔的枚举类型,那么使用这种定义计数常量的方法将是无用的。因此,希望使用后者的作者会避免使用前者 - 就这么简单。 - Shog9

2

TYPE_COUNT可以用于定义一个由枚举元素索引的数组:

type_info my_info[TYPE_COUNT]; 

或可用于 for 循环的退出条件。TYPE_UNKNOWN 可用于表示类型的非法或未定义值(-1 可作为 TYPE_COUNT 的替代值)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接