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(商业手臂编译器)引起的 为什么会失败?
答案 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;
我认为你不会有那个错误。