我正在为嵌入式应用程序编写一些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的编译器。或者,如果您有任何其他想法,我们将不胜感激。感谢。
答案 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只是为了确保它的值是您认为应该的值。有了一个列表,很长一段时间就不会搞砸了。