我可以启用警告来比较枚举值和非枚举值吗?

时间:2013-04-12 13:40:35

标签: ios objective-c c

我最近调试了一个问题,因为枚举与非枚举值进行了比较。这是一个简化的例子:

typedef NS_ENUM(NSInteger, MyType) {
    TypeVal1,
};

...

MyType type = TypeVal1;
int randomValue = 0;

BOOL compareTypeAndPrimiative = (randomValue == typeA); // No warning

是否可以为此打开警告?

如果需要,我可以通过显式转换来抑制:

BOOL iKnowWhatImDoing = (randomValue == (int) typeA);

2 个答案:

答案 0 :(得分:3)

不支持这种警告,因为C枚举不是强类型的,我相信标准要求将它们视为整数(或无符号整数)。将它们与常规整数进行比较一直被允许作为C标准的一部分,并且这种类型的警告最终会标记许多正确的代码。我确信有人可以链接到C标准的相应部分。

特别是对于iOS和Apple API,您会发现枚举值通常用作位掩码。在这些情况下,通常编写如下代码:

if ((value & flag) == kFlag) { ... }

你可能会说为此目的使用枚举是一个坏主意,但你可能最终不得不为各种代码禁用此警告。

答案 1 :(得分:0)

我刚刚浏览了LLVM手册,似乎没有选择。然后我尝试打开所有编译器警告(-Weverything),但是没有警告你的enum案例。

所以答案是否定的。

避免此类错误的最佳解决方案是适当地命名变量/常量。明确变量/常量代表什么。那么比较中的错误也应该是显而易见的。