c enum具有32位值

时间:2017-01-31 10:09:26

标签: c gcc

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

enum{
   val1    = 0xFFFFFFFFu,
   val2    = 0xFFFFFFFEu,
   val3    = 0xFFFFFFF0
};

问题:每次运行编译器时,Eclipse都会中止编译并使用以下错误标记枚举:
enter image description here
在我看来,32 int值不应该是枚举的问题,但显然它似乎是。 我会对一些意见表示感激:)

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

2 个答案:

答案 0 :(得分:4)

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

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

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

这就是枚举不适用于任何形式的位掩码或逐位操作的原因。

最佳解决方案是删除枚举,并使用#defineconst uint32_t,以最适合您特定情况的方式。

答案 1 :(得分:3)

你试过这个吗?:

enum {
   val1    = (int)0xFFFFFFFFu,
   val2    = (int)0xFFFFFFFEu,
   val3    = (int)0xFFFFFFF0
};

编辑:我刚刚在cygwin上安装了gcc并试了一下。

test-enum.c是原始版本,test-enum-int.c是具有显式转换的版本:

$ cc -std=c11 -pedantic-errors -c test-enum.c
test-enum.c:2:8: error: ISO C restricts enumerator values to range of 'int' [-Wpedantic]
   val1 = 0xFFFFFFFFu,
          ^
test-enum.c:3:8: error: ISO C restricts enumerator values to range of 'int' [-Wpedantic]
   val2 = 0xFFFFFFFEu,
          ^
test-enum.c:4:8: error: ISO C restricts enumerator values to range of 'int' [-Wpedantic]
   val3 = 0xFFFFFFF0u
          ^

$ cc -std=c11 -pedantic-errors -c test-enum-int.c

(没有抱怨)

$ cc --version
cc (GCC) 5.4.0
Copyright (C) 2015 Free Software Foundation, Inc.