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

CIF*_*ter 7 c enums signed objective-c llvm

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

typedef enum HBSnakeMovementDirection
{
    HBSnakeMovementDirectionUp = 1,
    HBSnakeMovementDirectionDown = -1,
    HBSnakeMovementDirectionRight = 2,
    HBSnakeMovementDirectionLeft = -2
}
HBSnakeMovementDirection;
Run Code Online (Sandbox Code Playgroud)

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

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

任何其他枚举值都没有问题.这有什么问题?我认为这可能与混合负面和正面枚举值有关,但我无法找到任何关于此的确定性.

(我能够提出所有积极的枚举值,让我可以解决这个问题,但它仍然困扰我,所以我想我会问它.)

我应该说,就像我的所有项目一样,我几乎发出了所有警告 - 因此,-Wconversion投诉 - 并将其视为错误.(我喜欢在编译时尽可能严格.)我正在使用LLVM 1.6.

更新1:HBSnakeMovementDirectionRight在前面的警告中逐字地使用结果:

HBSnakeMovementDirection movementDirectionRight = HBSnakeMovementDirectionRight;
Run Code Online (Sandbox Code Playgroud)

我必须施展HBSnakeMovementDirectionRight才能HBSnakeMovementDirection使警告沉默.

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

http://pastie.org/1580957

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

https://github.com/LucasTizma/Hebi

具体来说,以下树:

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

小智 3

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

\n\n

I\xe2\x80\x99ve 发现以下类型定义使得 OP 代码可以使用 Clang 1.6 进行编译:

\n\n
typedef enum HBSnakeMovementDirection \n{\n    HBSnakeMovementDirectionUp = 1,     // Default movement direction upon initialization via -init\n    HBSnakeMovementDirectionDown = -1,\n    HBSnakeMovementDirectionLeft = -2,\n    HBSnakeMovementDirectionRight = 2,\n    NBSnakeMovementDirectionNone = -3\n}\nHBSnakeMovementDirection;\n
Run Code Online (Sandbox Code Playgroud)\n\n

(注意附加NBSnakeMovementDirectionNone

\n\n

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

\n