typedef enum,在其中分配值

时间:2009-03-29 15:34:13

标签: c enums

使用gcc C99进行编译

我一直在使用enums一段时间。但是,我正在使用一些示例代码来开发我的应用程序。我偶然发现了一些像这样的代码。我被告知这是使用枚举时的最佳实践。但我不知道这有什么好处。

typedef enum {
    TYPE_DATE,
    TYPE_TIME,
    TYPE_MONEY,

    TYPE_COUNT,
    TYPE_UNKNOWN = TYPE_COUNT
} string_type_e;

为什么要TYPE_COUNT以及为什么要将TYPE_COUNT分配给TYPE_UNKNOWN

非常感谢任何建议,

4 个答案:

答案 0 :(得分:17)

默认情况下,编译器会自动为枚举提供从0开始的整数值。因此,日期将为零,时间一和二。下一个值赋予'psuedo'枚举值TYPE_COUNT,它将得到值3,恰好是“正确”枚举值的数量。

TYPE_UNKNOWN是另一个值,表示某个不是“正确”值的值,因此将无法通过测试e < TYPE_COUNT。使它等于TYPE_COUNT意味着每个不同的有意义的值是连续的,但我不知道有任何明显的优势(如果TYPE_COUNT小于2的幂,那么可能会影响编译器可以使用的表示形式,并且它的“很好”可以使值连续,但它并不重要,因为你不会将它们递增到TYPE_COUNT之后

答案 1 :(得分:6)

枚举值基本上是整数常量。默认情况下,它们被赋予enum + 1中的最后一个元素的值(第一个元素为0)。当你想要计算那些用数组或类似的东西来映射的元素时,就像那样声明的枚举(如果你从中添加或删除它将动态更新),你可以将COUNT常量放在它的结尾(在你的例子中是TYPE_COUNT)。为了能够区分枚举中的无效值,您可能希望声明另一个常量。在您的示例中,该常量将等于计数常量,这是一个大于枚举最大值的值。

答案 2 :(得分:3)

  

为什么要使用type_count以及为什么要将type_count分配给type_unknown?

要在enum的最大允许值上设置标签。请记住,否则无法检查给定值是否正确(在范围内)。

答案 3 :(得分:2)

TYPE_COUNT可用于标注由枚举元素索引的数组:

type_info my_info[TYPE_COUNT]; 

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