将枚举值传递给非标准的int参数?

时间:2012-05-17 23:19:19

标签: c++

示例:

enum SomeEnum
{
   DD,
   PP,
   NN
};

void someFunc(int a)
{
}

int main()
{
  SomeEnum e = DD;
   someFunc(a) // calls someFunc with value 0
  return 0;
}

这适用于MSVC,但它不标准吗?

由于

3 个答案:

答案 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而不是总是。即使情况并非如此,它也会使代码更加自我记录并显而易见。