4

我正在尝试用 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*/
    ...
}

我只收到枚举分配的警告,而不是整数变量分配的警告,尽管在我看来,两者都不应出现警告。

警告如下:

警告:: #66-D枚举值超出“int”范围 FEBRUARY= 0xFFFFFFFF

我在这里错过了什么吗?

4

1 回答 1

2

Int 赋值产生 -1 所以它在技术上是合法的。Per Arm 规范枚举是使用最小整数类型实现的,因此会产生错误。

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

  • unsigned char 如果不使用 --enum_is_int
  • 如果不使用--enum_is_int,则为签名字符
  • unsigned short 如果不使用 --enum_is_int
  • 如果不使用--enum_is_int,则签名短
  • 有符号整数
  • unsigned int 除了 C 和 --strict
  • 用 --strict 签署 long long 除了 C
  • unsigned long long 除了带有--strict 的C。

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

于 2019-01-13T15:39:27.023 回答