7

main.c ファイルのメソッドで、irq_type 型の変数 irq_raised を宣言します。別のファイルの typedef で irq_type を定義し、それを main.c の先頭に #import しました。

typedef enum
{
  IRQ_NONE = 0x0000,
  IRQ_VBLANK = 0x0001,
  IRQ_HBLANK = 0x0002,
  IRQ_VCOUNT = 0x0004,
  IRQ_TIMER0 = 0x0008,
  IRQ_TIMER1 = 0x0010,
  IRQ_TIMER2 = 0x0020,
  IRQ_TIMER3 = 0x0040,
  IRQ_SERIAL = 0x0080,
  IRQ_DMA0 = 0x0100,
  IRQ_DMA1 = 0x0200,
  IRQ_DMA2 = 0x0400,
  IRQ_DMA3 = 0x0800,
  IRQ_KEYPAD = 0x1000,
  IRQ_GAMEPAK = 0x2000,
} irq_type;

この変数を次のいずれかに割り当てることができます。

irq_raised = IRQ_NONE;

ただし、次のことをしようとすると:

irq_raised |= IRQ_HBLANK;

エラーが発生します:

Assigning to 'irq_type' from incompatible type 'int'

どうしてこれなの?

4

1 に答える 1

11

C ++では、キャストなしで列挙値にintを直接割り当てることはできません。irq_type実行しているビット単位のOR演算は、intになり、キャストなしで型の変数に割り当てようとします。これは、ここで発生するのと同じ問題です。

irq_type irq = 0;  // error

代わりに結果をキャストできます。

irq_type irq = IRQ_NONE;
irq = (irq_type)(irq | IRQ_HBLANK);

仕様からの関連情報:

列挙子は整数値にプロモートできます。ただし、整数を列挙子に変換するには明示的なキャストが必要であり、結果は定義されていません。

于 2012-05-28T18:23:24.897 に答える