如何检查枚举变量是否有效?

mus*_*afa 12 c enums

我有一个枚举:

enum myenum{
  typeA,
  typeB,
  typeC
} myenum_t;
Run Code Online (Sandbox Code Playgroud)

然后,使用enum参数调用函数:

int myfunction(myenum_t param1)
{
  switch(param1)
  {
    case typeA:
    case typeB:
    case typeC:
      //do the work
      break;

    default:
      printf("Invalid parameter");
  }
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是,随着myenum_t越来越多的价值观的增长,myfunction似乎并不那么优雅.

有没有更好的方法来检查枚举是否有效?

Pau*_*l R 18

一个常见的惯例是做这样的事情:

typedef enum {
  typeA,
  typeB,
  typeC,
  num_types
} myenum_t;
Run Code Online (Sandbox Code Playgroud)

然后你可以检查(t < num_types).

如果您随后添加更多枚举,例如

typedef enum {
  typeA,
  typeB,
  typeC,
  typeD,
  typeE,
  num_types
} myenum_t;
Run Code Online (Sandbox Code Playgroud)

然后num_types自动更新,您的错误检查代码不需要更改.

  • @duhanebel:它取决于枚举的广泛使用 - 如果它在一个公共头文件中定义并在多个API中使用,那么构成这些API的所有模块可能都想使用num_types进行健全性检查,验证等.还有我的另外一点,它对于定义数组大小等非常有用,例如,数组维度需要与枚举中的类型对应. (2认同)

Ric*_*III 5

您可以使用按位枚举:

enum myEnum {
    typeA = 1 << 0;
    typeB = 1 << 1;
    typeC = 1 << 2;
}

int myFunction(myEnum arg1)
{
    int checkVal = typeA | typeB | typeC;

    if (checkVal & arg1)
    {
        // do work here;
    }
    else
    {
        printf("invalid argument!");
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

对不起,我觉得这个问题看错了.

看来你想要做的是确定你是否传入了适当的值,而不是一些随机的无效选项.在这种情况下,最合乎逻辑的选择是:

if (arg1 < typeA || arg1 > typeC)
    printf("invalid argument");
Run Code Online (Sandbox Code Playgroud)

当然,这是假设您没有为枚举设置手动值,除非使用按位枚举,否则这很少见.

  • "但是,随着myenum_t越来越多的价值增长".是不是有可能溢出`1 << n`? (3认同)