BitField变量语法

时间:2014-05-12 10:34:47

标签: c++ c++11 bit-fields

我对C ++中BitFields的语法约定感兴趣,并且如果需要在分配的位数中考虑不同的命名变量方法。

union BitField32
{
    struct {
        unsigned int a : 1;
        unsigned int b : 1;
    };
    unsigned int data;
};
BitField32 Flags;

VS

union BitField32
{
    struct {
        unsigned int a, b : 1;
    };
    unsigned int data;
};
BitField32 Flags;

在底部示例中命名变量是否需要使用两位或者它们是否分配了一位

2 个答案:

答案 0 :(得分:3)

没有等价物:

使用:

struct S1 {
    unsigned int a : 1;
    unsigned int b : 1;
};

struct S2 {
    unsigned int a : 1, b : 1;
};

struct S3 {
    unsigned int a;
    unsigned int b : 1;
};

struct S4 {
    unsigned int a, b : 1;
};

我们有S1S2相同的内容,S3S4相同。
S1S3不是。 (https://ideone.com/6Jvh36

答案 1 :(得分:0)

一次取一条代码。

union BitField32
{
    struct {
        unsigned int a : 1;
        unsigned int b : 1;
    };
    unsigned int data;
};
BitField32 Flags;

这是包含两个位标志的结构的并集,带有unsigned int。 C ++标准保证将两个位标志打包到某种分配单元中,但不保证该单元的大小,位字段的分配或它们的对齐。特别是,从高到低和低到高的位分配都是常见的。

因此,尝试使用位字段来选择unsigned int中的位是实现定义的。如果它适用于一个编译器,则它可能不适用于另一个编译器。如果必须,请使用它,但要非常小心。

union BitField32
{
    struct {
        unsigned int a, b : 1;
    };
    unsigned int data;
};
BitField32 Flags;

此代码几乎可以保证是错误的。它是包含unsigned int和单位标志的结构的并集,带有unsigned int。它们不仅没有被分配一个位,甚至没有被打包成一个unsigned int。

C ++标准说bit-field属性不是该类型的一部分。如果你认为它与第一个样本相似,那就不是了。不要写这样的代码。