我有一些代码要移植到一个新平台,它开始给我一个关于比较来自两个不同枚举器列表的两个枚举器的错误。我很困惑为什么它给我一个错误。
C 规范(6.7.2.2)的枚举规范部分指出:
枚举器列表中的标识符被声明为具有 int 类型的常量,并且可以出现在任何允许的地方。127)带有 = 的枚举器将其枚举常量定义为常量表达式的值。如果第一个枚举数没有 =,则其枚举常数的值为 0。
所以我应该能够使用与 int 常量相同的枚举成员。在这个小示例程序中:
enum first {
a,
b
};
enum second {
c,
d
};
int main(){
enum first myf = a;
enum second mys = c;
if(myf == mys)
printf("same value\n");
return 0;
}
编译时gcc -Wall -Werror
我收到消息:
错误:'enum first' 和 'enum second' 之间的比较 [-Werror=enum-compare]
我知道,如果我对两者myf
和mys
asint
进行类型转换,编译器会很高兴,就像我可以使用 andint
的值设置几个 smyf
并mys
进行比较一样;但为什么我必须做这些来摆脱警告?为什么这个警告首先存在?这样做肯定有一些我没有看到的危险。
注意:
我已经阅读了关于这个 enum-compare 标志的 gcc 文档,但它并没有说明什么:
-Wenum-compare
警告不同枚举类型的值之间的比较。在 C++ 中,条件表达式中的枚举不匹配也会被诊断出来,并且默认情况下会启用警告。在 C 中,此警告由 -Wall 启用。