将整数强制转换为枚举类型是否正确?

cod*_*der 9 c++ enumeration casting

我的研究还没有得到答案(在SOF中),但我确信它之前肯定已经被问过了,如果有的话就会有所了解.

我在c ++中创建了一个枚举类型,然后我从消息头读取一个值,并希望将它存储到我的枚举类型的变量中,例如:

// My defined enum type
enum myNumType_t
{
    MY_NUM_UNKNOWN = 0,
    MY_NUM1 = 1,
    MY_NUM2 = 2,
    MY_NUM3 = 3,
    MY_NUM4 = 4,
    MY_NUM5 = 5,
};

// In the code
int main()
{
    myNum_t myNum = MY_NUM_UNKNOWN;
    myNum = getMessageNumType(); // returns an int

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

所以,这段代码不能用c ++编译,因为它不能将int转换为myNum_t,这是公平的.那么如果我投了它,myNum = (myNum_t) getMessageNumType();这当然现在编译.但它做对了吗?如果返回的值超出myNum_t的范围会发生什么?这里有"最佳实践"吗?

小智 5

但它做对了吗?

假设该值对枚举类型有效,是的.

如果返回的值超出myNum_t的范围会发生什么?

这取决于.

最高(并且不包括)最近的2的幂,你可以保证得到这个值.您的代码然后用它做什么取决于您.换句话说,给定您的代码,(int)(myNumType_t)7保证等于7.这很重要,因为有些人对枚举值使用按位运算,因此如果枚举有BIT0 = 1, BIT1 = 2, BIT2 = 4,则BIT0 | BIT1 | BIT2可以存储在相同的枚举类型中.

对于较大的值,可以说没有太大的用途.某些实现会将您的枚举存储在单个(8位)字节中,因此在这些实现上,(int)(myNumType_t)257可能不等于257.在其他实现中,它可能是.最好通过事先检查整数值来避免这种情况.