出于各种实现原因,我定义了以下枚举:
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:根据要求,这是在我的机器上发出的完整构建命令:
更新 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/