c enum具有32位值

Tho*_*ter 5 c gcc

我的软件需要一些无符号的32位枚举值,因此我实现了这个(简单的)枚举:

enum{
   val1    = 0xFFFFFFFFu,
   val2    = 0xFFFFFFFEu,
   val3    = 0xFFFFFFF0
};
Run Code Online (Sandbox Code Playgroud)

问题:每次运行编译器时,Eclipse都会中止编译并使用以下错误标记枚举:
在此输入图像描述
在我的意见中,32 int值不应该是枚举的问题,但显然它似乎是.我会感激一些输入:)

[更新1:]我将尝试在编译器设置中找到问题,我会让你保持最新

Lun*_*din 7

枚举常量(在val1您的示例中)必须是intC 标准的类型。这是一个有符号类型,在 32 位系统上,该值FFFFFFFF无法容纳在其中。因此,该值将以某种实现定义(特定于编译器)的方式转换为有符号整数。如果无法做到这一点,您将得到一个实现定义的信号。

编写依赖于此的代码是不好的,因为它是不可移植且不可预测的。没有编译器设置可以解决此问题,因为这是由语言设计决定的。

我相信可以删除 gcc 标志-pedantic/-pedantic-errors来消除警告,但这是一个坏主意,因为您将不再遵循标准 C. gcc 的默认非标准“臭鼬模式”,-std=gnu90或者-std=gnu11将编译代码,任何-std=cxx没有 的都会如此-pedantic-errors

这就是为什么枚举不适合任何形式的位掩码或按位操作。

最好的解决方案是摆脱枚举并使用 或#defineconst uint32_t以最适合您的特定场景为准。

  • 它们适用于不使用符号位的位掩码 (2认同)
  • @MM 不,他们确实不是,例如考虑 `mask << n` 或 `~mask` (2认同)
  • @MichaelWalz 我尝试用“-pedantic”发出警告的所有版本的 gcc ...也许您正在尝试 C++ 编译器,或者抑制警告的在线编译器 (2认同)