7

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

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;

我必须投到HBSnakeMovementDirectionRightHBSnakeMovementDirection使警告静音。

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

http://pastie.org/1580957

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

https://github.com/LucasTizma/Hebi

具体来说,以下树:

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

4

3 回答 3

3

正如 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有关。

于 2011-02-19T01:53:29.813 回答
1

我可以重现这个。对我来说,它肯定看起来像一个编译器错误。枚举中存在负值会导致编译器错误地认为“2”的值超出了枚举的范围,因此会发出警告。

无论您指定“2”还是“HBSnakeMovementDirectionRight”,行为都是相同的:它接受 1 并拒绝 2。

编辑:我在现有的 iPhone 项目中对此进行了测试,设置了编译器 LLVM 1.6 并设置了-Wconversion标志。

typedef enum HBSnakeMovementDirection
{
    neg1 = -1,
    pos1 = 1,
    pos2 = 2,
} HBSnakeMovementDirection;

HBSnakeMovementDirection d = -3;  // Warning: Can't convert int to HBSnakeMovementDirection
HBSnakeMovementDirection d = -2;  // OK
HBSnakeMovementDirection d = -1;  // OK
HBSnakeMovementDirection d = 0;  // OK
HBSnakeMovementDirection d = 1;  // OK
HBSnakeMovementDirection d = 2;  // Warning: Can't convert int to HBSnakeMovementDirection
HBSnakeMovementDirection d = pos2;  // Warning: Can't convert int to HBSnakeMovementDirection
于 2011-02-19T01:25:13.053 回答
1

绝对看起来像一个编译器错误。我在 Xcode 3 中打开项目并编译,但得到了错误。当我在 Xcode 4 中打开项目并使用 clang2.0 编译器时,我没有收到任何警告。

于 2011-02-19T01:50:27.510 回答