【发布时间】:2011-06-30 03:53:00
【问题描述】:
出于各种实施原因,我定义了以下枚举:
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
【问题讨论】:
-
int默认为signed或unsigned是编译器特定的。因此,尝试使用接收参数为signed int并检查。顺便说一句,显示一段您实际使用的代码。为什么声明和同义词在您的typedef中具有相同的名称。虽然这不是问题,只是想知道。 -
@Mahesh,
int默认总是signed。您可能会想到char,它确实具有实现定义的签名。 @LucasTizma,您需要向我们展示您使用枚举值的地方的行和相关变量声明,以便我们为您提供帮助。 -
§6.7.2.2/2 和 C99 中的 /4 表示枚举常量(
HBSnakeMovementDirectionRight)具有可表示为int的值,枚举类型(HBSnakeMovementDirection)应能够表示枚举的所有成员的值。所以,你的enum类型似乎没有问题... -
尝试隔离最少量的代码来重现您的问题。
HBSnakeMovementDirection movementDirectionRight = HBSnakeMovementDirectionRight; printf("%d\n", movementDirectionRight);使用 clang 1.6 和 GCC 4.2.1 编译并运行,没有任何警告。 -
除了
enum中的标识符之外,还会有一些旧的、被遗忘的HBSnakeMovementDirectionRight标识符吗?可能是#define或const int。
标签: objective-c c enums llvm signed