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

时间:2015-07-01 12:04:33

标签: c gcc enums

我有以下代码。

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

如何解决此问题?

2 个答案:

答案 0 :(得分:20)

直接从search engine optimisation引用C11章节,枚举说明符

  

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

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

OTOH,char是一个枚举常量,FOO会给你typeof(FOO),作为标准命令

  

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

用作int的类型。

现在,如果您的实施中的枚举为f2,那么unsigned intf1f2

接下来,您会收到警告。

  

如何解决此问题?

好吧,如果您将int的类型更改为f2,这会给出枚举的类型,那么typeof(Baz)f1的类型都将相同。编译器会很高兴。

SEE LIVE HERE

答案 1 :(得分:16)

这是C标准中一个已知的“错误”。枚举常量保证为int类型,而枚举变量是实现定义的整数类型。

See this以供参考。