我有一个带有一堆标志的位字段,并且我需要一种快速而肮脏的方式将所有内容都设置为零,因此,我不是将结构盲目地转换为整数,而是决定将位字段放入其中是“更好”的选择与实际整数的并集。

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

10-08 11:55