C枚举警告

Toa*_*ter 3 c enums compiler-warnings

我正在更新物理模拟C代码以使用来自#defines长列表的枚举,但是遇到了一个奇怪的错误.结构包含枚举为:

enum spec_mod_type_enum 
{ SPEC_MOD_PL=1, 
  SPEC_MOD_EXP=2,
} spec_mod_type[NXBANDS];
Run Code Online (Sandbox Code Playgroud)

(NXBANDS只是一个#defined值)

由于疏忽,没有为-1添加密钥,而在另一个文件中,它被修改为:

xplasma->spec_mod_type[n] = -1;
Run Code Online (Sandbox Code Playgroud)

但是,当在clang和gcc中编译时,这会导致无声失败; 该值设置为undefined,而不是-1,带来令人不快的后果.这很奇怪:

  1. 我的印象是enums 可以设置为超出其范围的值.

  2. 我们没有得到关于-Wall(或-Wextra)的警告,当看起来像枚举的确切事情应该警告.

任何人都可以告诉我为什么会发生这种情况?和/或哪些编译器标志会警告我们这一点,或者至少更改枚举的默认行为以允许此设置?

Bat*_*eba 7

您的程序的行为可能因平台而异:

C标准允许编译器为枚举数选择任何底层整数类型,它能够表示给定的所有显式值:在您的情况下为1和2.

因此编译器可能会为枚举选择一个无符号类型.在这种情况下分配负值将导致环绕模2 ^ n,其中n是用于表示无符号类型的位数.

另一方面,它可能会选择一个签名类型,在这种情况下-1可以表示.

一种补救措施是在您的枚举器中引入负虚拟值.