C 编译器检查多个枚举中的重叠



>有谁知道是否有可能让编译器检查两个枚举是否重叠?

我们有几个软件包,每个包都有一个带有eeprom地址定义的枚举 有没有办法让编译器组合这些并检查重叠?

typedef enum
{
DEF_A = 1,
DEF_B = 2
} Enum1;
typedef enum
{
DEF_C = 1,
DEF_D = 3
} Enum2;
enum 
{
Enum1, 
Enum2
};

=> 生成编译错误,因为 DEF_1 和 DEF_3 具有相同的值

有谁知道是否有可能让编译器检查两个枚举是否重叠?

是的,我知道,不,这是不可能的。出于同样的原因,您不会找到有关两个不同整数被分配 0 的编译器警告:这完全没问题。

您应该了解,每个枚举列表只不过是标识符到值的映射。允许不同的标识符映射到相同的值,即使在同一个枚举列表中也是如此:

enum count { ZIP = 0, ZILCH = 0, NADA = 0, ZERO = 0, ONE, TWO, THREE };

不是问题。如果要避免具有相同值的标识符,可以做的是将它们全部放在同一个枚举列表中,并且不要分配其中任何一个,或者最多分配第一个。

如果需要在多个枚举列表中检查这一点,则需要在 C 语言之外寻找解决方案。

使用像 gcc (-Woverride-init这样的优秀编译器,您可以创建一个"超级数组",以指定初始值设定项的形式包含项目中所有已知的枚举常量:

const int dummy[] = 
{
[DEF_A] = 0,
[DEF_B] = 0,
[DEF_C] = 0,
[DEF_D] = 0,
};

gcc 编译器现在会在重复的情况下戳你:

x|warning: initialized field overwritten [-Woverride-init]|
x|warning: (near initialization for 'dummy[1]') [-Woverride-init]|

其中 x 是第二次遇到值dummy[1]的行号([DEF_C]行(。

最新更新