枚举类型比较错误

时间:2010-12-20 08:53:45

标签: c++ gcc arm

typedef enum {
  TYPE_A = 0,
  TYPE_B,
  TYPE_C
} OBJTYPE;

假设上面有枚举类型。
我正在使用arm-g ++来开展工作。

任何类型的宏都是这样定义的:

#define ANY_TYPE ((OBJTYPE)-1)

但是在我测试之后,比较是错误的:

if (param->type == ANY_TYPE) something();
else error();

param->类型设置为ANY_TYPE,其类型为OBJTYPE。我用'%d'记录了它们,它们显示为255.但它是错误的并且发生了错误。

此问题不是由RVCT(商业手臂编译器)引起的 为什么会失败?

3 个答案:

答案 0 :(得分:3)

-1是枚举的非法值。

语言标准(7.2枚举声明)说:

  

对于枚举在哪里   e min 是最小的   枚举器和e max 是   最大的,枚举的值   是底层类型的值   在b min 的范围内   b max ,其中b min   和b max 分别是   最小和最大的价值   可存储的最小位域   e min 和e max

根据这个,合法值是0,1,2和3(那些可以用两位表示的值)。您应该添加ANY_TYPE枚举器以使用它。

答案 1 :(得分:0)

  

我用“%d”和“%d”记录了它们   它们显示为255.但它是   错误和错误发生。

当您的编译器将ANY_TYPE分配给param->类型为8位整数时发出声音。尝试使用

之类的东西
#define ANY_TYPE ((OBJTYPE)(int)-1)

或者,或者将比较的两边都转换为int。

答案 2 :(得分:0)

为什么不使用

typedef enum {
  ANY_TYPE = -1,
  TYPE_A = 0,
  TYPE_B,
  TYPE_C
} OBJTYPE;

我认为你不会有那个错误。