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

时间:2012-02-06 14:44:13

标签: c enums

我有一个枚举:

enum myenum{
  typeA,
  typeB,
  typeC
} myenum_t;

然后,使用枚举参数调用函数:

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

    default:
      printf("Invalid parameter");
  }
  return 0;
}

但是,随着myenum_t随着越来越多的值而增长,myfunction看起来并不那么优雅。

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

7 个答案:

答案 0 :(得分:18)

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

typedef enum {
  typeA,
  typeB,
  typeC,
  num_types
} myenum_t;

然后您可以查看(t < num_types)

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

typedef enum {
  typeA,
  typeB,
  typeC,
  typeD,
  typeE,
  num_types
} myenum_t;

然后num_types会自动更新,您的错误检查代码无需更改。

答案 1 :(得分: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;
}

不好意思,我似乎错误地读了这个问题。

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

if (arg1 < typeA || arg1 > typeC)
    printf("invalid argument");

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

答案 2 :(得分:4)

让编译器完成它的工作,不要将int转换为enum类型,你应该做得很好。

答案 3 :(得分:1)

我过去曾使用的一个技巧:

enum foo {FIRST_FOO, BAR, BLETCH, BLURGA, BLAH, LAST_FOO};

然后检查您的值是否为> FIRST_FOO && < LAST_FOO 1

当然,这假设您的枚举值之间没有间隙。

否则,不,没有好的方法来做你所要求的(至少在C中)。

<小时/> 1 来自最新的在线C Language Standard

6.7.2.2枚举说明符
...
3枚举器列表中的标识符声明为类型为int和的常量 可能出现在允许的任何地方。 109) =的枚举器定义了它 枚举常量作为常量表达式的值。如果第一个调查员有 否=,其枚举常量的值为0。没有=的每个后续枚举数 将其枚举常量定义为由其获得的常量表达式的值 将1添加到上一个枚举常量的值。 (使用枚举器 =可能会生成枚举常量,其值与其他值相同 枚举。)枚举的枚举数也称为其成员。

答案 4 :(得分:0)

你也不能做像

这样的事情
enum myEnum {typeA,typeB, typeC};

int myFunction (myEnum arg1) {
    if (arg1 >= typeA && arg1 <= typeC) {
        // do work here
    } else {
        printf("invalid argument!");
    }
    return 0;
}

答案 5 :(得分:0)

不幸的是,没有简单的方法来处理语言级别(至少使用C),您只需要确保只使用通过enum定义的变量。

虽然您可以与-Werror一起启用以下编译器警告之一:

  • -Wswitch
  • -Wswitch-default
  • -Wswitch-enum

如果在切换内部遗漏了其中一个枚举,则会导致构建失败。

答案 6 :(得分:0)

C ++中的枚举已经具有比C更强的类型。

采取以下简单程序:

#include <iostream>

enum E
{
    A,
    B 
};

void f(E e)
{
}

int main()
{
    f(1);
}

使用GCC编译器我会收到此错误:

enum.cpp: In function ‘int main()’:
enum.cpp:15: error: invalid conversion from ‘int’ to ‘E’
enum.cpp:15: error:   initializing argument 1 of ‘void f(E)’

因此,您可以看到已经检查了枚举成员。

如果你想要更强大的类型检查,并且有一个支持C ++ 11的编译器,你可以对枚举使用更强大的类型检查,请参阅http://en.wikipedia.org/wiki/C%2B%2B11#Strongly_typed_enumerations