c – 为什么ARM将“0xFFFFFFFF”视为枚举的“int”范围之外,而不是赋值?

我想在C(armcc file.c)中编译以下代码:

typedef enum A
{
    JANUARY,
    FEBRUARY= 0xFFFFFFFF  /* Warning seen on this line */
}A;

int main()
{
    int max = 0xFFFFFFFF; /* No warning seen for this line*/
    ...
}

我只收到枚举赋值的警告,而不是整数变量赋值,但在我看来,两者都没有警告.

警告如下:

Warning: #66-D: enumeration value is out of “int” range
FEBRUARY= 0xFFFFFFFF

我在这里错过了什么吗?

最佳答案 Int赋值生成-1所以它在技术上是合法的. Per Arm spec enum使用最小整数类型实现,因此会产生错误.

枚举
枚举类型的对象以包含枚举范围的最小整数类型实现.根据枚举中枚举数的范围,枚举的存储类型是以下第一个:

> unsigned char如果不使用–enum_is_int
>如果不使用–enum_is_int,则为signed char
>如果不使用–enum_is_int,则为unsigned short
>如果不使用–enum_is_int,则签名为short
>签署int
>带有–strict的C以外的unsigned int
>使用–strict签署除C以外的长队长
>除了带有–strict的C之外的unsigned long long.

以这种方式实现枚举可以减少数据大小.命令行选项–enum_is_int强制枚举的基础类型至少与int一样宽.

点赞