比较两个枚举值时如何获得警告

时间:2018-07-02 11:55:16

标签: objective-c xcode enums gcc-warning

在Objective-C的这个小型演示中:

第一个枚举:

typedef NS_ENUM(NSUInteger, Day) {
     DaySunday,
     DayMonday,
     DayTuesday
};

第二个枚举:

typedef NS_ENUM(NSUInteger, Month) {
    MonthJanuary,
    MonthFebruary,
    MonthMarch,
    MonthApril
};

比较时:

Day sunday = DaySunday;
Month january = MonthJanuary;
if (sunday == january) {
     NSLog(@"case1 with warning");
  }
if (DaySunday == january) {
     NSLog(@"case2 without warning");
  }

和Xcode快照: enter image description here

那么在case2中如何获得警告?

3 个答案:

答案 0 :(得分:0)

(Objective-)C中的枚举类型是非常弱的类型。根据C标准,每个枚举常量(您的january等)都有一个整数类型,不是。此外,在需要时会将枚举类型的值隐式转换为整数类型。

两个操作数均为枚举类型时,

Clang会警告您,并且它只是一个 warning ,因为C Standard在整数之间进行比较是正确的值。

在您的DaySunday == january中,左操作数为整数类型,右操作数隐式转换为整数类型,因此这完全是合法且正确的标准C。Clang可以选择发出警告,为什么不这样做可能取决于Clang内部的设计决定或设计结果。

要感谢Clang经常在标准C不需要警告的地方发出警告,但是您不能依靠它显示C中的所有陷阱。

要解决您的问题,可以根据需要将字面量转换为枚举类型(Day)DaySunday == january,但可以合理地确定这会使C看起来更糟;-)

答案 1 :(得分:-1)

我不确定为什么会发生这种行为,但这很奇怪很酷。要获得警告,必须将_filterItems(items) { return items.filter(async item => { let isTrue = await AsyncStorage.getItem('key'); return isTrue; }) } 强制转换为类型DaySunday

Day

if ((Day)DaySunday == january) { NSLog(@"case2 without warning"); } 显式转换为january不会触发警告,因此静态分析器似乎正确地将Month视为january类型(因为您声明了这样),但会隐式转换Month以便进行比较。

说句公道话,第一种情况下的警告实际上并不是理想的行为,因为DaySundayDay都是NSUIntegers,因此具有可比性。正如您在运行此代码时所观察到的,两个比较都是正确的,这意味着警告实际上没有意义。

答案 2 :(得分:-2)

您必须将enum更改为int才能删除警告

 if ((int)sunday == (int)january) {
    NSLog(@"case1 with warning");
}