【问题标题】:Enumeration type comparison error枚举类型比较错误
【发布时间】:2011-05-28 03:37:25
【问题描述】:
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->type 设置为 ANY_TYPE,其类型为 OBJTYPE。我用 '%d' 记录了它们,它们显示为 255。但它是错误的,并且发生了错误。

这个问题不是由 RVCT(商业 arm 编译器)引起的。
为什么会失败?

【问题讨论】:

  • 在枚举中添加ANY_TYPE = -1 有什么问题,顺便说一句?哦,全大写标识符是宏的指示。
  • 我认为 (OBJTYPE)-1 被解释为减法,不像(OBJTYPE)(-1)

标签: c++ gcc arm


【解决方案1】:

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

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

对于一个枚举,其中 emin 是最小的 枚举器和 emax 是 最大,枚举的值 是基础类型的值 在 bmin 到 bmax,其中 bmin 和 bmax 分别是, 的最小值和最大值 可以存储的最小位域 emin 和 emax.

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

【讨论】:

    【解决方案2】:

    我用 '%d' 和 它们显示为 255。但它的 false 并发生错误。

    听起来你的编译器将 ANY_TYPE 分配给 param->type 作为 8 位整数。尝试使用类似

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

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

    【讨论】:

    • (int) 将如何提供帮助? -1 已经有类型 int?
    【解决方案3】:

    你为什么不使用

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

    我想你不会有那个错误。

    【讨论】:

    • 是的,这是我已经应用的解决方案。但我的问题是找个理由。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-09
    • 2011-03-03
    • 1970-01-01
    • 1970-01-01
    • 2013-12-23
    • 1970-01-01
    • 2012-05-04
    相关资源
    最近更新 更多