我有以下类型:
My_Union_t Data;
typedef union My_Union {
byte Byte;
struct {
byte b0:1;
byte b1:1;
byte b2:1;
byte b3:1;
byte b4:1;
byte b5:1;
byte b6:1;
byte b7:1;
} Bits;
} My_Union_t;
因为,bit字段没有地址,我创建了一个接收它并返回它的函数。
将位字段作为参数传递是最好的方法吗?
Bits Invert(Bits Bit)
{
return (~Bits)
}
void Function(void)
{
Data.Bits.b1 = Invert(Data.Bits.b1);
}
答案 0 :(得分:2)
您无法将~
运算符应用于整个struct Bits
,仅适用于其各个部分。将数据类型更改为byte
将解决此问题:
byte Invert(byte bit) {
return (~bit);
}
这将编译和工作(demo)。编译器将提供所有“魔法”以进行适当的位操作。
答案 1 :(得分:0)
如何传递和返回参数的细节在很大程度上取决于编译器。参数将以自然类型传递,例如int。位域不是自然类型,它们的实现依赖于编译器。
通过将参数推入堆栈,将参数传递给函数。返回值在寄存器中返回。将值推入堆栈时,编译器会注意保持堆栈对齐,这意味着它将在32位机器上推入32位块,在64位机器上推入64位卡盘。
即使一个字节在大多数系统上也不会作为字节传递,它将作为int传递。
(另一种方法是使用本机类型并自己进行位操作。)