我有一些代码我正在移植到一个新平台,它开始给我一个关于比较来自两个不同枚举器列表的两个枚举器的错误。我很困惑,为什么它给我一个错误。
C规范(6.7.2.2)的枚举指定程序部分声明:
枚举器列表中的标识符声明为类型为int和的常量 可能出现在允许的任何地方。 127)带有=的枚举数定义它 枚举常量作为常量表达式的值。如果第一个调查员有 no =,其枚举常量的值为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
同时转换为int
,编译器会很高兴,就像我可以设置几个int
一样来自myf
和mys
的值并进行比较;但为什么我必须 其中来摆脱警告?为什么这个警告首先存在?这样做有一些危险,我没有看到。
注意:
我已阅读此枚举比较标志的gcc文档,但它没有说明任何内容:
-Wenum-比较
警告不同枚举类型的值之间的比较。在C ++中,还会诊断条件表达式中的枚举不匹配,并且默认情况下会启用警告。在C中,此警告由-Wall启用。
答案 0 :(得分:14)
这不是一个警告,因为标准合规性问题,这是“这似乎不对”的警告之一。如果你想到枚举的典型用法,那么在许多情况下进行这样的比较并没有多大意义。例如:
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) { ... }
这评估为真,但一般来说,这种比较没有多大意义。如果您知道自己的意思,那么类型转换将说服编译器,正如您所指出的那样。
答案 1 :(得分:2)
它警告你,因为你有警告标志。标志描述并不能解释它存在的原因,但可以安全地假设它存在以防止不同枚举类型之间的意外比较,因为通常是一个错误。
此外,您可以使用与常量相同的枚举值。如果你说if (myf == c)
那么它很可能不会发出警告(我说很可能是因为我没有进行过实验,而且GCC诚实地可以用这个警告做任何想做的事,但技术上{{1} }只是一个整数常量,不带有c
类型。但是你明确地比较了不同枚举类型的两个值。
答案 2 :(得分:1)
它是一个警告,但是当您使用-Wall -Werror编译时,所有警告都被视为错误 你可以找到类似问题的东西。
Is there a correct way to avoid warnings when comparing two different enums?
关于
HIMS
答案 3 :(得分:1)
if((int)myf == (int)mys)
应该这样做。但这是一种肮脏的做法,只有当两个枚举是同一组的不同“版本”时才使用它,就像新的一个在最后包含新的关键词一样。