我有以下代码.
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和, f2是int.
接下来,您会收到警告.
我该如何解决这个问题?
好吧,如果你改变了f2to 的类型typeof(Baz),它给出了枚举的类型,那么两种类型f1和f2将是相同的.编译器会很高兴.