7

在我的 main.c 文件的一个方法中,我声明了变量 irq_raised,它的类型为 irq_type。我在另一个文件的 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 直接分配给枚举值。您正在执行的按位 OR 运算会生成一个 int,然后您尝试将其分配给类型为irq_type不进行强制转换的变量。这与您在这里遇到的问题相同:

irq_type irq = 0;  // error

您可以改为转换结果:

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

规范中的相关信息:

枚举数可以提升为整数值。但是,将整数转换为枚举数需要显式强制转换,并且未定义结果。

于 2012-05-28T18:23:24.897 回答