问题描述
我有一个匿名union
,其中包含一个uint8_t
和一个位字段struct
。
union
{
struct
{
uint8_t ID : 1;
uint8_t C : 4;
uint8_t RM : 1;
uint8_t SWRST : 1;
uint8_t STS : 1;
} ControlByte1;
uint8_t ControlByte1;
};
您会看到uint8_t
和struct
实例都称为ControlByte1
。我想做的是让ControlByte1
成为uint8_t
,同时能够使用ControlByte1.ID
,ControlByte1.C
,ControlByte1.RM
,{{ 1}}和ControlByte1.SWRTS
。不出所料,当我编写ControlByte1.STS
,ControlByte1 = ...;
或... = ControlByte1;
时,编译器无法知道我是说function(ControlByte1);
是ControlByte1
还是{{1 }}。有什么办法吗?
谢谢!
编辑1:
我希望它们具有相同的名称,因为ControlByte1是一个1字节的I2C控制字节,其中包含ID,C,RM,SWRST和STS字段。我希望能够以字节的形式访问ControlByte1,并且还可以单独访问它的字段。
编辑2:
我可能已经找到了通过重载隐式类型转换运算符的方法。
uint8_t
我不确定我是否正确地执行了重载,但是它确实可以编译,还没有尝试运行我的代码。
struct
我猜测struct
{
uint8_t ID : 1;
uint8_t C : 4;
uint8_t RM : 1;
uint8_t SWRST : 1;
uint8_t STS : 1;
operator uint8_t*() {return (uint8_t *)this;}
operator uint8_t() {return *(uint8_t *)this;}
} ControlByte1;
无法编译,因为我也需要重载uint8_t var1 = ControlByte1; // Compile
uint8_t *ptr1 = ControlByte1; // Compile
uint8_t *ptr2 = &ControlByte1; // Does not compile!!!
var1 = ControlByte1; // Compile
ptr1 = ControlByte1; // Compile
ptr2 = &ControlByte1; // Does not compile!!!
运算符?不需要重载赋值运算符,因为我不会直接向&ControlByte1
赋值。
编辑3:
这更有意义。
&
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)