2

我最近调试了一个问题,该问题是由于将枚举与非枚举值进行比较而引起的。这是一个简化的示例:

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

...

MyType type = TypeVal1;
int randomValue = 0;

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

是否可以为此打开警告?

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

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

2 回答 2

3

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

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

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

您可能会争辩说为此目的使用枚举是一个坏主意,但您最终可能不得不对所有类型的代码禁用此警告。

于 2013-04-12T14:02:16.137 回答
0

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

所以答案是否定的。

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

于 2013-04-12T14:06:19.263 回答