【问题标题】:enum Not Type Checked by Compiler?枚举未由编译器检查类型?
【发布时间】:2013-06-28 06:51:02
【问题描述】:

有了这些枚举...

typedef enum {
    ThisThingA = 0,
    ThisThingB = 1
} ThisThing;

typedef enum {
    ThatThingX = 8,
    ThatThingY = 9
} ThatThing;

还有这些属性...

@property (nonatomic) ThisThing thisThing;
@property (nonatomic) ThatThing thatThing;

我能做到……

self.thisThing = thatThingX;

并且我没有收到编译器的警告,这是我所期望的。为什么编译器没有警告?为什么我可以将 ThatThing 类型的东西分配给 ThisThing 类型的东西?

根据 Martin R 的回答进行编辑:但如果我这样做......

[self setThisThing:thatThingX];

我收到警告:从枚举类型“ThatThing”隐式转换为不同的枚举类型“ThisThing”

(Xcode 4.6.3 和 iOS 6.0)

【问题讨论】:

  • int a =5;诠释 b = 6; a=b - 也没有警告)
  • 我曾经在这种情况下收到警告。因为我不介意它们,所以我无法说出启用或禁用这些警告的选项。
  • @Maria 好的,我明白了。但这些都是打字的。我是新手,但我认为这就是 typedef 的意义所在。
  • @HermannKlecker:选项为-Wenum-conversion,默认开启。由于某种原因,它不适用于属性“点”语法,见下文。

标签: objective-c c enums


【解决方案1】:

编译器选项“Implicit Enum Conversions (-Wenum-conversion)”默认是打开的,你实际上会得到一个警告 如果您分配给不同枚举类型的变量:

ThisThing x = ThatThingX;

或者如果你使用setter方法来设置属性:

[self setThisThing:ThatThingX];

在这两种情况下,您都会收到警告

从枚举类型“ThatThing”到不同枚举类型“ThisThing”的隐式转换 [-Wenum-conversion]

仅当您使用“点”语法设置值时

self.thisThing = ThatThingX;

那么您不会收到警告,因此这可能是编译器中的错误。

【讨论】:

    【解决方案2】:

    enum 是整数类型的 C 构造。它经过类型检查。您的用法是相同的默认整数类型,因此在编译器眼中或根本没有错。 你的用法是 int。

    如果您将def int 键入为Bob 并再次键入Josephine,这有助于代码清晰。 Bob 和 Josephine 仍然是相同的 int 类型。

    如果您声明两个枚举但一个使用 NSUInteger 而另一个使用 NSInteger 您可能会收到一个警告,具体取决于您的隐式转换设置。

    这确实是一道 C 题。

    【讨论】:

      【解决方案3】:

      实际上枚举选项被视为 NSInteger。所以 thatThingX 默认值为 0。当你分配self.thisThing = thatThingX;时,self.thisThing得到的值为0。所以它会变成ThisThingA。这就是没有警告的原因。

      【讨论】:

      • 我已经编辑了我的问题,所以每个枚举选项都有一个唯一的值。不过,没有任何警告。
      猜你喜欢
      • 2013-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-30
      • 2018-10-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多