我刚刚发现,在设置枚举变量的值时,几个变量可以具有相同的值。例如,以下代码完全正确:
enum my_enum
{
A = 3,
B = 4,
C = 3,
D = 5
};
但是,在我的框架中,我有来设置每个变量,因为它用于将错误代码传递给其他系统。我不能在不要求其他团队修改错误代码的情况下更改错误代码的值。
我将所有错误代码重新分组到枚举中,以确保我们不会因为不同的原因(以前的情况)重用相同的错误代码。但是现在,没有什么能阻止任何人为不同的错误重用相同的值。
如果我将相同的值分配给枚举中的不同名称,是否可以让编译器返回错误?
我可以用gcc或clang编译。
答案 0 :(得分:1)
switch
语句不能有两个具有相同值的情况。所以你可以在某处开关。没有default:
的情况下,如果你添加一个新的值,gcc会警告你在switch语句中没有处理枚举的成员。如果枚举的两个值相同,则编译将失败。
一些例子:
typedef enum {
ERR_NONE = 0,
ERR_SAME = 0
} err_t;
volatile err_t e = ERR_NONE;
int main( int argc, char* argv[] )
{
switch( e )
{
case ERR_NONE:
break;
case ERR_SAME:
break;
}
return 0;
}
{p}与gcc -Wall switch.c
给出:
switch.c: In function 'main':
switch.c:16:9: error: duplicate case value
case ERR_SAME:
^
switch.c:13:9: error: previously used here
case ERR_NONE:
^
和...
typedef enum {
ERR_NONE = 0,
ERR_NEXT,
ERR_MISSING,
} err_t;
volatile err_t e = ERR_NONE;
int main( int argc, char* argv[] )
{
switch( e )
{
case ERR_NONE:
break;
case ERR_NEXT:
break;
}
return 0;
}
{p}与gcc -Wall switch-missing.c
给出:
switch-missing.c: In function 'main':
switch-missing.c:12:5: warning: enumeration value 'ERR_MISSING' not handled in switch [-Wswitch]
switch( e )
^