我对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;
在底部示例中命名变量是否需要使用两位或者它们是否分配了一位
答案 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;
};
我们有S1
和S2
相同的内容,S3
和S4
相同。
S1
和S3
不是。 (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属性不是该类型的一部分。如果你认为它与第一个样本相似,那就不是了。不要写这样的代码。