我有一些代码正在移植到新平台,它开始给我一个关于比较两个不同枚举器列表中的两个枚举器的错误。我很困惑为什么它会给我一个关于此的错误。
C 规范 (6.7.2.2) 的枚举规范部分指出:
The identifiers in an enumerator list are declared as constants that have type int and
may appear wherever such are permitted.127) An enumerator with = defines its
enumeration constant as the value of the constant expression. If the first enumerator has
no =, the value of its enumeration constant is 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 secondary’之间的比较 [-Werror=enum-compare]
我知道如果我同时输入myf
and mys
as int
编译器会很高兴,就像我可以设置几个int
s 的值来自myf
and mys
并进行比较;但为什么我必须这样做either这些来摆脱警告?为什么这个警告首先存在?这样做肯定存在一些我没有看到的危险。
NOTE:
我已阅读关于此 enum-compare 标志的 gcc 文档,但它没有说明太多内容:
-Wenum-比较
警告不同枚举类型的值之间的比较。在 C++ 中,条件表达式中的枚举不匹配也会被诊断出来,并且默认情况下会启用警告。在 C 中,此警告由 -Wall 启用。
这不是由于标准合规性问题而发出的警告,而是“这似乎不对”类型的警告之一。如果您考虑枚举的典型用途,那么在许多情况下进行这样的比较并没有多大意义。例如:
enum Day {
Sunday,
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday
};
enum Month {
January,
February,
March,
April,
May,
June,
July,
August,
September,
October,
November,
December
};
enum Day day = Wednesday;
enum Month month = April;
if (day == month) { ... }
这评估为 true,但一般来说,比较没有多大意义。如果您知道您是认真的,那么类型转换将使编译器信服,正如您所指出的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)