我有一个带有一堆标志的位字段,并且我需要一种快速而肮脏的方式将所有内容都设置为零,因此,我不是将结构盲目地转换为整数,而是决定将位字段放入其中是“更好”的选择与实际整数的并集。
union Flags {
uint _all;
struct {
uint status : 2;
uint expanded : 1;
uint draw : 1;
uint drawChildren : 1;
uint hidden : 1;
uint disabled : 1;
uint used : 1;
uint deletable : 1;
uint incomplete : 1;
uint isStatic : 1;
uint isConst : 1;
uint isVolatile : 1;
uint isInline : 1;
uint isMutable : 1;
uint isExtern : 1;
uint isRegister : 1;
uint threadLocal : 1;
uint packed : 1;
uint dirty : 1;
uint native : 1;
uint dynamic : 1; // 22
uint _padding : 10;
} flags;
};
我的问题是这有多便携?我可以期望它使用GCC作为编译器在不同平台(主要对Windows,Linux,macos,android,ios)上具有可移植性吗?
还是强制转换为整数并以此方式设置并摆脱联合才是可行的方法?我一直在读,位域不是可移植的,但是例如Qt似乎经常使用它们,并且它在我列出的平台上似乎可以统一工作。
最后但并非最不重要的一点是,即使没有工会,我也可以期望位字段具有可移植性吗?
编辑:无法添加
C
作为标记,但是我也需要在C中使用它,所以我不能使用std::bitset
,而且我的成员占用的时间不止一位。编辑2:还请注意,没有一个成员越过其对齐边界,我认为这会导致编译器不添加额外的填充。
编辑3:也许我可以使用GCC的
__attribute__(packed)
阻止编译器处理结构? 最佳答案
位字段根本不可移植。它们之间的填充取决于实现方式。也许您想要std::bitset