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.在其他实现中,它可能是.最好通过事先检查整数值来避免这种情况.