为什么'typeof enum constant'在与枚举类型的变量相比时会产生警告?

kun*_*han 21 c enums gcc

我有以下代码.

typedef enum {FOO, BAR} Baz;

int main()
{
    Baz f1 = FOO;
    typeof(FOO) f2 = FOO;
    return (f1 == f2);
}
Run Code Online (Sandbox Code Playgroud)

我的编译使用gcc -Wextra foo.c生成警告说

foo.c: In function ‘main’:
foo.c:7:13: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 return (f1 == f2);
             ^
Run Code Online (Sandbox Code Playgroud)

我的gcc版本

gcc --version
gcc (Ubuntu 4.9.2-10ubuntu13) 4.9.2
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?

Sou*_*osh 20

直接从C11章节§6.7.2.2,枚举说明符引用,

每个枚举类型应与char有符号整数类型或无符号整数类型兼容.类型的选择是实现定义的.

因此,枚举变量的类型不是由标准定义的.它可以是上述任何一种.

FOO作为枚举常数的OTOH typeof(FOO)int作为标准命令给你

声明为枚举常量的标识符具有类型int.

正被用作的类型f2.

现在,如果枚举是unsigned int您的实现,所以是f1和, f2int.

接下来,您会收到警告.

我该如何解决这个问题?

好吧,如果你改变了f2to 的类型typeof(Baz),它给出了枚举的类型,那么两种类型f1f2将是相同的.编译器会很高兴.

SEE LIVE HERE


Lun*_*din 16

这是C标准中一个已知的"bug".枚举常量保证是类型int,而枚举变量是实现定义的整数类型.

请参阅此参考.