示例:
enum SomeEnum
{
DD,
PP,
NN
};
void someFunc(int a)
{
}
int main()
{
SomeEnum e = DD;
someFunc(a) // calls someFunc with value 0
return 0;
}
这适用于MSVC,但它不标准吗?
由于
答案 0 :(得分:7)
enum
具有基础整数类型(用于存储enum
的值的类型),enum
值可以隐式转换为该整数类型的值。 / p>
在您的情况下,基础类型为int
,值为0.一切正常。
答案 1 :(得分:0)
枚举器列表中的标识符被声明为类型为int的常量,并且可以出现在允许的地方。
6.7.2.2 http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf
答案 2 :(得分:0)
它绝对有效,因为正如GManNickG和番茄所说的那样,所有枚举都是int类型(实际上,在C中,enums是int,你可以为它们分配枚举范围之外的值。
typedef enum _foo
{
val1 = 57
} foo;
...
foo f = 99; // compiles in C but not C++
事实上,如果函数参数类型是bool或float或其他一些原始数字类型,大多数编译器都不会抱怨,因为枚举充当0,-1,200等常量整数值......
我要说的是,如果您可以控制someFunc的签名,并且您希望在C ++中确保没有传入无效值,请将其更改为
void someFunc(SomeEnum a);
更多类型安全
此外,始终至少初始化您的第一个枚举值。我可能错了,但是,在当天,编译器被允许为你的枚举选择一个任意的起始值。大部分时间它选择0而不是总是。即使情况并非如此,它也会使代码更加自我记录并显而易见。