【发布时间】:2009-09-30 18:45:29
【问题描述】:
我正在为嵌入式应用程序编写一些 C 代码,但遇到了一个问题,其中与枚举值的比较没有正确执行。以如下代码sn-p为例:
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 的编译器。或者,如果您有任何其他想法,将不胜感激。谢谢。
【问题讨论】:
-
您如何检查执行是否在循环内继续?
-
当你说测试失败时,你是否真的添加了代码来确保它评估为假(例如
if (n < MAX...) {printf...}),或者你只是意味着它应该失败? -
是的,我已经对此做了很多调试,并单步执行了代码。我可以在我的调试器中观察 n 增加到与 MAX_ENUM_ITEMS (919) 相同的值,然后比较失败。不是跳出循环,而是在循环中继续执行。
-
我会尝试使用不同版本的 gcc。我(曾经)遇到过编译器故障,导致执行流程进入非常奇怪的地方。
-
您是否在编译时进行了优化?如果是这样,编译器可以看到循环内部和循环之后的某些代码位相似,并将它们围绕它们打乱;此时,调试器在尝试确定与当前指令对应的源代码行时会感到困惑,并且偶尔会显示 IP 在循环内执行一两条指令,而实际上它在其他地方。我不确定 g++,但我在 VC++ 和激进的优化设置中见过很多次。在这里查看的最好方法是
printf。