我们假设,我有以下结构:
struct my_struct {
uint32_t bf1 : 3;
uint32_t bf2 : 5;
uint32_t bf3 : 16;
uint32_t bf4 : 8;
};
和以下枚举:
enum bf1_values {
Val1 = 0x0;
Val2 = 0x4;
Val3 = 0x7;
};
另外,bf1的getter和setter函数:
uint32_t bf1_getter() {
return global_struct.bf1; // cast value to (uint32_t)?
}
void bf1_setter(enum bf1_values val) {
global_struct.bf1 = val; // cast enum to (uint32_t)?
}
我应该在getter和setter函数中使用类型转换来保证安全吗?
编辑:
该结构应该发送给HW。
Aaditi:
我想要实现的是确保将enum
正确写入位域,并正确读取位域。
不需要在这里进行投射 - 如果符合要求的实施不应该破坏其他成员,则任务已经是“安全的”。假设正常的整数溢出语义适用,唯一有问题的情况是有符号溢出,这可能会引发一个信号(但是我很难看到在实际情况下如果位字段宽度小于一个完整字,因为硬件支持溢出检测将缺乏),并在其他方面实现定义。此警告不适用于您的示例,因为目标类型是无符号的。
请记住,位字段语义在很大程度上是实现定义的 - 即使使用int
以外的类型实际上是语言扩展 - 并且由您来检查编译器是否按照您的期望在所有相关平台上执行操作。
一种更便携但也不太方便的方法是使用uint32_t
并手动进行小提琴。如果你不需要这种可持续性,它应该是正常的。