在c中,标准没有定义枚举是有符号还是无符号。但是,当我尝试将枚举值与最低(即0)枚举常量进行比较时,我得到警告“无符号整数与零的无意义比较”。 (编译器是IAR嵌入式工作台。)
typedef enum
{
BAR,
BAZ
} Foo;
//later...
Foo x = (Foo)some_integral_value;
if (x >= BAR) // <- this gives me the warning
//stuff
但是,我需要检查枚举的范围,因为它是从整数类型转换而来的。是否有一种避免警告的好方法,如果编译器决定更改基础类型,警告仍然有效?
答案 0 :(得分:2)
在C中,这是一个错误的问题。
int
类型,无论如何现在举例到
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枚举类型的值可隐式转换为整数类型。如果基础类型未修复,则该值可从以下列表中转换为第一类型,能够保持其整个值范围:
int
,unsigned int
,long
,unsigned long
,long long
或unsigned long long
。如果基础类型是固定的,则可以将值转换为其提升的基础类型。
因此,如果您的枚举符合int
,则应始终使用int
。
答案 2 :(得分:0)
Brendan的第一条评论 适用于C并且确实回答了这个问题。也就是说,强制枚举中第一项的值为1可以消除编译警告。在原始海报的情况下,这是否是可行的答案取决于第一个值是否必须由于其他原因而为零。
P.S。很抱歉发布了对问题的回复,而不是我正在评论的答案,但Stack Overflow不会让我做后者。