枚举类型值无法正确比较

时间:2009-09-30 18:45:30

标签: c gcc enums compare

我正在为嵌入式应用程序编写一些C代码,而且我遇到了一个问题,即与枚举值的比较没有正确执行。请使用以下代码段:

typedef unsigned int UINT16;
typedef enum enum_items_tag
{
   ITEM_1,
   ITEM_2,
   ITEM_3,

   /* ... */

   ITEM_918,
   MAX_ENUM_ITEMS
} enum_items_t;

UINT16 n;

for ( n = 0; n < MAX_ENUM_ITEMS; n++ )
{
   // Do something
}

代码按预期执行,直到n增加到等于MAX_ENUM_ITEMS,此时比较失败,并且在循环内继续执行(当它应该退出时)。我过去做过这样的事情没有任何问题。

我尝试将n重新键入为enum_items_t(即将n声明为“enum_items_t n”),并将MAX_ENUM_ITEMS类型转换为UINT16。在这一点上我唯一可以想到的是,我的枚举类型(919)中的项目数可能存在问题。有谁知道枚举类型是否有这样的限制?我正在使用基于GCC的编译器。或者,如果您有任何其他想法,我们将不胜感激。感谢。

4 个答案:

答案 0 :(得分:4)

这可能是一个错误吗?我希望gcc在0开始枚举......但你说你在调试时看到值增加到919。所以这让我觉得你在枚举中偶然得到了额外的值,或者枚举值是基于1的,就像命名方案所暗示的那样。

如果ITEM_1 == 1那么要么在1开始你...或者更改MAX_ENUM_ITEMS的值,如下所示:

typedef enum enum_items_tag
{
   ITEM_1,
   ITEM_2,
   ITEM_3,

   /* ... */

   ITEM_918,
   MAX_ENUM_ITEMS = ITEM_918
} enum_items_t;

答案 1 :(得分:1)

尝试使用n = ITEM_1开始循环?

答案 2 :(得分:0)

ISO C在enum的内部表示上相当含糊,但它确实保证的一种方法是使用的类型应该足够宽以处理所有值,只要你没有超过限制int。除非您使用某些编译器开关来启用特定于实现的行为,该行为将枚举表示设置为固定的(例如char)。

在任何情况下,请尝试打印sizeof(enum_items_t)并查看您获得的内容。

此外,int每个ISO C至少应为16位宽,但在嵌入式平台(尤其是DSP)上遇到各种奇怪的事情,因此请检查int是否真的是16比特也是。

答案 3 :(得分:0)

我打印出MAX_ENUM_ITEMS只是为了确保它的值是您认为应该的值。有了一个列表,很长一段时间就不会搞砸了。