我有一个枚举:
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
看起来并不那么优雅。
有没有更好的方法来检查枚举是否有效?
答案 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。