验证枚举的所有设置值是否不同

时间:2015-06-24 09:21:09

标签: c enums compilation

我刚刚发现,在设置枚举变量的值时,几个变量可以具有相同的值。例如,以下代码完全正确:

enum my_enum
{
    A = 3,
    B = 4,
    C = 3,
    D = 5
};

但是,在我的框架中,我来设置每个变量,因为它用于将错误代码传递给其他系统。我不能在不要求其他团队修改错误代码的情况下更改错误代码的值。

我将所有错误代码重新分组到枚举中,以确保我们不会因为不同的原因(以前的情况)重用相同的错误代码。但是现在,没有什么能阻止任何人为不同的错误重用相同的值。

如果我将相同的值分配给枚举中的不同名称,是否可以让编译器返回错误?

我可以用gcc或clang编译。

1 个答案:

答案 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 )
 ^