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