我正在更新一个物理模拟 C 代码以使用来自一长串#defines 的枚举,但遇到了一个奇怪的错误。 一个结构包含一个枚举:
enum spec_mod_type_enum
{ SPEC_MOD_PL=1,
SPEC_MOD_EXP=2,
} spec_mod_type[NXBANDS];
(NXBANDS 只是一个#defined 值)
由于疏忽,没有为 -1 添加 key ,而在另一个文件中,它被修改为:
xplasma->spec_mod_type[n] = -1;
但是,当在 clang 和 gcc 中编译时,这会导致静默失败;该值设置为未定义,而不是 -1,会带来不愉快的后果。这很奇怪,因为:
我的印象是枚举可以设置为超出其范围的值。
我们使用 -Wall(或 -Wextra)没有收到关于此的警告,而枚举似乎正是应该发出警告的。
谁能告诉我为什么会发生这种情况?和/或哪些编译器标志会就此警告我们,或者至少更改枚举的默认行为以允许此设置?
最佳答案
您的程序的行为可能因平台而异:
C 标准允许编译器为能够表示所有给定显式值的枚举器选择任何基础整数类型:在您的情况下为 1 和 2。
因此编译器可能为您的枚举选择一个无符号类型。在这种情况下分配负值会导致环绕模 2^n,其中 n 是用于表示无符号类型的位数。
另一方面,它可能选择一个带符号的类型,在这种情况下 -1 是可表示的。
一种补救措施是在您的枚举器中引入负虚拟值。
关于C 枚举警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31855252/