作为参数的位字段和函数的返回

时间:2015-02-14 10:32:58

标签: c bit-fields

我有以下类型:

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);     
}

2 个答案:

答案 0 :(得分:2)

您无法将~运算符应用于整个struct Bits,仅适用于其各个部分。将数据类型更改为byte将解决此问题:

byte Invert(byte bit) {
    return (~bit);
}

这将编译和工作(demo)。编译器将提供所有“魔法”以进行适当的位操作。

答案 1 :(得分:0)

如何传递和返回参数的细节在很大程度上取决于编译器。参数将以自然类型传递,例如int。位域不是自然类型,它们的实现依赖于编译器。

通过将参数推入堆栈,将参数传递给函数。返回值在寄存器中返回。将值推入堆栈时,编译器会注意保持堆栈对齐,这意味着它将在32位机器上推入32位块,在64位机器上推入64位卡盘。

即使一个字节在大多数系统上也不会作为字节传递,它将作为int传递。

(另一种方法是使用本机类型并自己进行位操作。)