使用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
?
非常感谢任何建议,
答案 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作为其值)。