我有以下代码。
typedef enum {FOO, BAR} Baz;
int main()
{
Baz f1 = FOO;
typeof(FOO) f2 = FOO;
return (f1 == f2);
}
我使用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);
^
我的gcc版本
gcc --version
gcc (Ubuntu 4.9.2-10ubuntu13) 4.9.2
如何解决此问题?
答案 0 :(得分:20)
直接从search engine optimisation
引用C11
章节,枚举说明符,
每个枚举类型应与
§6.7.2.2
,有符号整数类型或无符号整数类型兼容。类型的选择是实现定义的。
因此,enum变量的类型不是由标准定义的。它可以是上述任何一种。
OTOH,char
是一个枚举常量,FOO
会给你typeof(FOO)
,作为标准命令
声明为枚举常量的标识符具有类型
int
。
用作int
的类型。
现在,如果您的实施中的枚举为f2
,那么unsigned int
和f1
为f2
。
接下来,您会收到警告。
如何解决此问题?
好吧,如果您将int
的类型更改为f2
,这会给出枚举的类型,那么typeof(Baz)
和f1
的类型都将相同。编译器会很高兴。
答案 1 :(得分:16)
这是C标准中一个已知的“错误”。枚举常量保证为int
类型,而枚举变量是实现定义的整数类型。
See this以供参考。