7

さまざまな実装上の理由から、次の列挙型を定義しました。

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

ただし、を使用しようとするとHBSnakeMovementDirectionRight、次の警告が表示されます。

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

他の列挙値のいずれにも問題はありません。ここでの問題は何ですか?負の列挙値と正の列挙値の混合に関係しているのではないかと思いましたが、これについて明確なことは何もわかりません。

(この問題を回避できるすべての正の列挙値を思い付くことができましたが、それでも困惑したので、それについて質問したいと思いました。)

私のすべてのプロジェクトと同様に、私はほとんどすべての警告、つまり、-Wconversionの苦情を有効にし、それらをエラーとして扱うことを述べなければなりません。(コンパイル時にできるだけ厳密にするのが好きです。)私はLLVM1.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

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 に答える