2010-12-20 95 views
2
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(商业arm编译器)引起的。
它为什么失败?

+2

将'ANY_TYPE = -1'添加到枚举中有什么问题,BTW?哦,全帽标识符是一个宏指示。 – sbi 2010-12-20 09:09:29

+0

我认为(OBJTYPE)-1被解释为一个减法,不像'(OBJTYPE)( - 1)'。 – Benoit 2010-12-20 09:14:26

回答

3

-1是您的枚举的非法值。

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

对于枚举其中 Ë分钟是最小 枚举和e 最大是最大的 ,枚举 的值是基本类型 的值在范围b 分钟至 b max,其中b 分钟 和b 最大分别是 可以存储 Ë分钟和e 最大的 最小位字段的最小值和最大值。

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

+0

+1:你应该参考报价。 – 2010-12-20 10:19:37

0

我登录他们都用“%d”,它们都显示为255 但它 虚假和错误发生。

您的编译器将ANY_TYPE分配给param->类型为8位整数。尝试使用类似

#define ANY_TYPE ((OBJTYPE)(int)-1) 

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

+0

'(int)'将如何帮助? '-1'将已经有'int'类型了? – 2010-12-20 10:25:33

0

你为什么不使用

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

我想你不会有错误,那么。

+0

是的,这是我已经申请的解决方案。但我的问题是找到一个理由。 – JaycePark 2010-12-22 05:00:36