enum SomeEnum
{
DD,
PP,
NN
};
void someFunc(int a)
{
}
int main()
{
SomeEnum e = DD;
someFunc(a) // calls someFunc with value 0
return 0;
}
这个工作在MSVC但它是非标准?
由于
enum SomeEnum
{
DD,
PP,
NN
};
void someFunc(int a)
{
}
int main()
{
SomeEnum e = DD;
someFunc(a) // calls someFunc with value 0
return 0;
}
这个工作在MSVC但它是非标准?
由于
一种enum
具有底层整数类型(用于存储enum
的值的类型),并且enum
值可以隐式转换到整数类型的值。
在你的情况下,基础类型为int
,值为0.一切都没问题。
枚举器列表中的标识符被声明为具有int类型的常量,并且可以出现在允许的任何位置。
6.7.2.2这里http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf
这是绝对有效的,因为,作为GManNickG和西红柿说,所有枚举都是int类型(事实上,在C,Enum也整数,你可以将它们的范围值枚举。
typedef enum _foo
{
val1 = 57
} foo;
...
foo f = 99; // compiles in C but not C++
事实上,因为枚举充当恒定整数值像0,-1,200,等等大多数编译器不会抱怨,如果该函数的参数类型是布尔或浮动或其他原语类型数...
我在说什么, ð虽然说的是,如果你有超过someFunc的签名控制,你想++,以确保用C没有无效的值传递中,将其更改为
void someFunc(SomeEnum a);
更多类型安全
而且,总是至少初始化您的第一枚枚举值。我可能是错的,但是,在当天,编译器被允许为你的枚举选择一个任意的起始值。大多数时候它选择0但不总是。即使情况并非如此,它会使代码变得更加自我记录并且显而易见。
我没有说他们都是'int',我说他们是整型。根据枚举器中的值,它们可能是'unsigned','(unsigned)long'或'(unsigned)long long'。 – GManNickG
请注意,在C++ 11中,这仅适用于无限制枚举。对于范围枚举('enum class'),没有隐式转换为整型。 –