objective-c - 为什么具有负值的枚举会导致 Objective-C/C 出现问题?

标签 objective-c c enums llvm signed

出于各种实现原因,我定义了以下枚举:

typedef enum HBSnakeMovementDirection
{
    HBSnakeMovementDirectionUp = 1,
    HBSnakeMovementDirectionDown = -1,
    HBSnakeMovementDirectionRight = 2,
    HBSnakeMovementDirectionLeft = -2
}
HBSnakeMovementDirection;

但是,如果我尝试使用 HBSnakeMovementDirectionRight,我会收到以下警告:

Implicit conversion changes signedness: 'int' to 'HBSnakeMovementDirection'

它对任何其他枚举值都没有问题。这里有什么问题?我认为这可能与混合负枚举值和正枚举值有关,但我找不到关于此的任何明确信息。

(我能够想出所有允许我解决这个问题的正枚举值,但它仍然难倒我,所以我想我会问问它。)

我应该声明,对于我的所有项目,我启用了几乎所有警告——因此,-Wconversion 的提示——并将它们视为错误。 (我喜欢在编译时尽可能严格。)我正在使用 LLVM 1.6。

更新 1:从字面上看,任何 HBSnakeMovementDirectionRight 的使用都会导致前面的警告:

HBSnakeMovementDirection movementDirectionRight = HBSnakeMovementDirectionRight;

我必须将 HBSnakeMovementDirectionRight 转换为 HBSnakeMovementDirection 以使警告静音。

更新 2:根据要求,这是在我的机器上发出的完整构建命令:

http://pastie.org/1580957

更新 3:这是我在 GitHub 上托管的确切项目:

https://github.com/LucasTizma/Hebi

具体来说,下面的树:

https://github.com/LucasTizma/Hebi/tree/89262e2e53881584daf029e3dd5f1e99dfbd6f96

最佳答案

正如 Darren 所说,它看起来确实像一个编译器错误,Dave 说 Clang 2.0 不会发生这种情况。

我发现以下类型定义使 OP 代码可以使用 Clang 1.6 进行编译:

typedef enum HBSnakeMovementDirection 
{
    HBSnakeMovementDirectionUp = 1,     // Default movement direction upon initialization via -init
    HBSnakeMovementDirectionDown = -1,
    HBSnakeMovementDirectionLeft = -2,
    HBSnakeMovementDirectionRight = 2,
    NBSnakeMovementDirectionNone = -3
}
HBSnakeMovementDirection;

(注意附加的 NBSnakeMovementDirectionNone)

这可能与 LLVM 错误有关 1884 ,已修复。

关于objective-c - 为什么具有负值的枚举会导致 Objective-C/C 出现问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5047367/

相关文章:

javascript - 如何使用 stringByEvaluatingJavaScriptFromString 在亚马逊上获取 ASIN 代码?

java - 有没有办法让 SonarQube 只警告不完整的 Switch 语句?

c - ECC 反模奇异时间执行

c - 尝试释放()链表节点会导致 C 中的段错误

c - C语言将数字打印成字符串

java - 如何在静态枚举中获取下一个

iphone - 应用程序加载和启动画面

objective-c - 使用核心动画在文本上伪造亚像素抗锯齿

objective-c - 将一个透明的 NSWindow 永久地放在另一个 NSWindow 之上

c - 使用 scanf() 时的段错误