直接比较两个枚举时为什么会出错?

Mik*_*ike 12 c comparison enums gcc integer

我有一些代码我正在移植到一个新平台,它开始给我一个关于比较来自两个不同枚举器列表的两个枚举器的错误.我很困惑,为什么它给我一个错误.

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;
}
Run Code Online (Sandbox Code Playgroud)

编译时gcc -Wall -Werror我收到消息:

错误:'enum first'和'enum second'之间的比较[-Werror = enum-compare]

我知道,如果我都强制类型转换myf,并mysintS中的编译器会很高兴,就像我可以设置几个int从s的价值观myfmys做的比较; 但为什么我必须做其中任何一个以摆脱警告?为什么这个警告首先存在?这样做有一些危险,我没有看到.


注意:
我已经阅读了关于这个enum-compare标志的gcc文档,但它没有说明任何内容:

-Wenum-compare
关于不同枚举类型的值之间的比较的警告.在C++中,还会诊断条件表达式中的枚举不匹配,并且默认情况下会启用警告.在C中,此警告由-Wall启用.

Fat*_*ror 15

这不是一个警告,因为标准合规问题,这是"这似乎不对"的警告之一.如果你想到枚举的典型用法,那么在许多情况下进行这样的比较并没有多大意义.例如:

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) { ... }
Run Code Online (Sandbox Code Playgroud)

这评估为真,但一般来说,这种比较没有多大意义.如果您知道自己的意思,那么类型转换将说服编译器,正如您所指出的那样.

  • 呸仍然使用星期日作为一周的第一天?(+ 1,BTW) (6认同)