我最近调试了一个问题,因为枚举与非枚举值进行了比较。这是一个简化的例子:
typedef NS_ENUM(NSInteger, MyType) {
TypeVal1,
};
...
MyType type = TypeVal1;
int randomValue = 0;
BOOL compareTypeAndPrimiative = (randomValue == typeA); // No warning
是否可以为此打开警告?
如果需要,我可以通过显式转换来抑制:
BOOL iKnowWhatImDoing = (randomValue == (int) typeA);
答案 0 :(得分:3)
不支持这种警告,因为C枚举不是强类型的,我相信标准要求将它们视为整数(或无符号整数)。将它们与常规整数进行比较一直被允许作为C标准的一部分,并且这种类型的警告最终会标记许多正确的代码。我确信有人可以链接到C标准的相应部分。
特别是对于iOS和Apple API,您会发现枚举值通常用作位掩码。在这些情况下,通常编写如下代码:
if ((value & flag) == kFlag) { ... }
你可能会说为此目的使用枚举是一个坏主意,但你可能最终不得不为各种代码禁用此警告。
答案 1 :(得分:0)
我刚刚浏览了LLVM手册,似乎没有选择。然后我尝试打开所有编译器警告(-Weverything
),但是没有警告你的enum
案例。
所以答案是否定的。
避免此类错误的最佳解决方案是适当地命名变量/常量。明确变量/常量代表什么。那么比较中的错误也应该是显而易见的。