我的软件需要一些无符号的32位枚举值,因此我实现了这个(简单的)枚举:
enum{
val1 = 0xFFFFFFFFu,
val2 = 0xFFFFFFFEu,
val3 = 0xFFFFFFF0
};
Run Code Online (Sandbox Code Playgroud)
问题:每次运行编译器时,Eclipse都会中止编译并使用以下错误标记枚举:
在我的意见中,32 int值不应该是枚举的问题,但显然它似乎是.我会感激一些输入:)
[更新1:]我将尝试在编译器设置中找到问题,我会让你保持最新
枚举常量(在val1您的示例中)必须是intC 标准的类型。这是一个有符号类型,在 32 位系统上,该值FFFFFFFF无法容纳在其中。因此,该值将以某种实现定义(特定于编译器)的方式转换为有符号整数。如果无法做到这一点,您将得到一个实现定义的信号。
编写依赖于此的代码是不好的,因为它是不可移植且不可预测的。没有编译器设置可以解决此问题,因为这是由语言设计决定的。
我相信可以删除 gcc 标志-pedantic/-pedantic-errors来消除警告,但这是一个坏主意,因为您将不再遵循标准 C. gcc 的默认非标准“臭鼬模式”,-std=gnu90或者-std=gnu11将编译代码,任何-std=cxx没有 的都会如此-pedantic-errors。
这就是为什么枚举不适合任何形式的位掩码或按位操作。
最好的解决方案是摆脱枚举并使用 或#define,const uint32_t以最适合您的特定场景为准。