C++ 从不兼容类型分配给[自定义类型定义]';int';

C++ 从不兼容类型分配给[自定义类型定义]';int';,c++,c,enums,typedef,C++,C,Enums,Typedef,在main.c文件中的一个方法中,我声明了变量irq_,它是irq_类型的。我在另一个文件的typedef中定义了irq#u type,并在main.c的顶部导入它 typedef enum { IRQ_NONE = 0x0000, IRQ_VBLANK = 0x0001, IRQ_HBLANK = 0x0002, IRQ_VCOUNT = 0x0004, IRQ_TIMER0 = 0x0008, IRQ_TIMER1 = 0x0010, IRQ_TIMER2 = 0

在main.c文件中的一个方法中,我声明了变量irq_,它是irq_类型的。我在另一个文件的typedef中定义了irq#u type,并在main.c的顶部导入它

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'

为什么?在C++中,

不能直接将int赋值给没有枚举的枚举值。您正在执行的按位OR操作将产生一个int,然后您将尝试在不使用强制转换的情况下将其分配给类型为
irq\u type
的变量。这与您在这里遇到的问题相同:

irq_type irq = 0;  // error
您可以强制转换结果:

irq_type irq = IRQ_NONE;
irq = (irq_type)(irq | IRQ_HBLANK);
规范中的相关信息:

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


C是一个文件不是一个类——是C++还是C,它们是不同的还是目标C,是唯一使用了导入的语言。您的do循环未完成。更新方法是一个宏。。。。。。这些都不是标准的,所以很难理解,说它是一个类只是一个打字错误#导入工作在C++和C中,特别是因为我在xCODE中编写文件。我只展示了do循环中适用的部分,因此在结尾使用了省略号(…)。请澄清语言混乱。你说你有“代码>主。C < /代码>,它将指示普通C,但是你所说的错误只发生在C++中,而事实上,导入工作似乎表明它是被编译成目标C++的。您是否在XCode中有覆盖语言选择的设置?提供XCode使用的编译器调用命令会有所帮助(我相信您可以从构建日志的某个地方找到它)。也许这会使它更清晰。让我猜一下:你正在编译为C++,不是吗?这就是问题所在,谢谢!什么文件来自于?”RielytStut:这是从最近的C++规范(草案)中找到的。@ RyyEtTest:到2005稿(不是非常近期的,仍然相关的,最近的草稿可用)。请参阅第129页,其中他们介绍了枚举类型与其基础整型之间的关系。