如何将枚举与其第零值进行比较?

时间:2014-04-07 19:35:20

标签: c enums

在c中,标准没有定义枚举是有符号还是无符号。但是,当我尝试将枚举值与最低(即0)枚举常量进行比较时,我得到警告“无符号整数与零的无意义比较”。 (编译器是IAR嵌入式工作台。)

typedef enum
{
    BAR,
    BAZ
} Foo;

//later...
Foo x = (Foo)some_integral_value;
if (x >= BAR) // <- this gives me the warning
    //stuff

但是,我需要检查枚举的范围,因为它是从整数类型转换而来的。是否有一种避免警告的好方法,如果编译器决定更改基础类型,警告仍然有效?

3 个答案:

答案 0 :(得分:2)

在C中,这是一个错误的问题。

  • 所有枚举常量始终为int类型,无论如何
  • 轻松地使用枚举类型来回转换 隐式转换,不需要显式转换(AKA强制转换)

现在举例到

enum Foo
{
    BAR,
    BAZ
};

//later...
Foo x = (Foo)some_integral_value;

这甚至都没有编译,因为在C Foo中没有定义为任何内容,您必须使用enum Foo,或者提供适当的typedef,例如

typedef enum Foo Foo;

也许你用C ++编译器编译C代码?无论如何,请提供一个显示您问题的完整示例。

答案 1 :(得分:1)

听起来像在C中,所有枚举都应该有int类型,但我还是留下了这些建议,因为你的编译器是非标准的C,或者编译为C ++。


如果你可以控制这些枚举的定义,你可以让它们从1开始:

enum Foo
{
    BAR = 1,
    BAZ
};

您还可以添加一个假的负值以强制签名:

enum Foo
{
    NEGATIVE_PLACEHOLDER = -1,
    BAR,
    BAZ,
};

在C ++ 11中,您可以为枚举提供明确的基础类型:

enum Foo : int
{
    BAR,
    BAZ
};

请参阅this page,特别是以下部分:

  

enum name : type { enumerator = constexpr , enumerator = constexpr , ... }

     

...

     

2)声明一个未固定的枚举类型,其基础类型是固定的

听起来这种类型应始终是可预测的:

  

unscoped枚举类型的值可隐式转换为整数类型。如果基础类型未修复,则该值可从以下列表中转换为第一类型,能够保持其整个值范围:intunsigned intlongunsigned longlong longunsigned long long。如果基础类型是固定的,则可以将值转换为其提升的基础类型。

因此,如果您的枚举符合int,则应始终使用int

答案 2 :(得分:0)

Brendan的第一条评论 适用于C并且确实回答了这个问题。也就是说,强制枚举中第一项的值为1可以消除编译警告。在原始海报的情况下,这是否是可行的答案取决于第一个值是否必须由于其他原因而为零。

P.S。很抱歉发布了对问题的回复,而不是我正在评论的答案,但Stack Overflow不会让我做后者。