我正在将一些代码移植到新平台, 结果出现了一个错误,指出比较了两个来自不同枚举列表的枚举器。我不明白为什么会出现这种错误。
C规范(6.7.2.2节)中的"enumeration specificers"部分规定如下:
枚举器列表中的标识符被声明为具有 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
编译时,我会收到以下错误信息:
error: comparison between ‘enum first’ and ‘enum second’ [-Werror=enum-compare]
我知道如果将myf
和mys
都强制转换为int
,编译器就会满意,就像我可以使用myf
和mys
的值来设置一对int
,然后进行比较;但是,为什么我必须这样做才能消除警告?为什么在第一次出现这个警告呢?我肯定没有看到其中存在的风险。
注意:
我已经阅读了关于此枚举-比较标志的gcc文档,但它并没有说太多有用的信息:
-Wenum-compare
警告在不同枚举类型之间的值比较。在C++中,条件表达式中的枚举不匹配也会被诊断,并默认启用该警告。在C中,该警告由-Wall启用。
int
类型,那么为什么在比较一个int
和另一个int
时需要警告呢? - Mikeenum color {blue, yellow, green};
和enum form {round, square, pentagonal};
。那么问你的“颜色”是否是“五边形”的说法就没有任何意义了... - vonbrand-Werror
选项后,你不能继续抱怨出现错误。 - v.oddou