c - 枚举类型值未正确比较

标签 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 的编译器。或者,如果您有任何其他想法,我们将不胜感激。谢谢。

最佳答案

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

如果 ITEM_1 == 1 则将 n 从 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;

关于c - 枚举类型值未正确比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1499963/

相关文章:

c++ - 使用 uclibc 编译已删除的函数失败

Swift 编译器崩溃 : Illegal instruction: 4, 非规范或未经检查的类型

c++ - 通过用于 Objective-C/iOS 的 UIInterfaceOrientationMask 了解 C++ 枚举

c - 无法在不丢失预处理器的情况下在 C 中包含 ASM 头文件

c - 如何将程序链接到具有相同函数名称但不同实现的两个库?

c - 在链表的末尾插入一个节点

class - 是否建议在 UML 类图中与枚举类建立关联?

c - 如何使用c程序检查子目录是否包含文本文件

GCC 编译错误 :/usr/bin/ld: cannot find -lsqlite3. lib

c++ - 使用自动工具检查预编译头文件?