c++ - 将整数转换为枚举类型是否正确?

标签 c++ casting enumeration

<分区>

我的研究还没有得出这个问题的答案(在 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;
}

因此,这段代码无法在 C++ 中编译,因为它无法将 int 转换为 myNum_t,这很公平。那么如果我将它转换为 myNum = (myNum_t) getMessageNumType(); 现在当然可以编译了。但它做对了吗?如果返回值超出 myNum_t 的范围会怎样?这里有我缺少的“最佳实践”吗?

最佳答案

But does it do the right thing?

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

What happens if the returned value is out of range of myNum_t?

视情况而定。

直到(并排除)最接近的 2 的幂,您一定会得到准确的值。然后你的代码用它做什么取决于你。换句话说,给定你的代码,(int)(myNumType_t)7 保证等于 7。这很重要,因为有些人对枚举值使用按位运算,所以如果枚举有 BIT0 = 1, BIT1 = 2, BIT2 = 4, BIT0 |位1 | BIT2 可以存储在相同的枚举类型中。

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

关于c++ - 将整数转换为枚举类型是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19159379/

相关文章:

c++ - 有没有办法为整个解决方案设置 visual studio 的 pragma disable 警告?

c++ - visual studio lnk2019 和 1120 错误

python - 由列表构造函数转换为 int 的字节

c# - 在 foreach 语句中处理转换异常

c++ - 结构元素的枚举 C++

c++ - Object Mat(args); 之间的区别 - 内存分配明智 -和 Object *Mat = new Mat(args);在 C++ 中?

c++ - 继承类的复制构造函数

c++ - 在没有显式转换的情况下将字符显示为整数

java - 更改程序无法使用 1.16 美元

C++ 枚举复制构造函数和赋值运算符