有如下代码:
typedef union
{
struct bits
{
uint32_t bit0 : 1;
uint32_t bit1 : 1;
uint32_t bit2 : 1;
...
...
uint32_t bit14 : 1;
}
uint32_t value;
} MyUnion;
重要的是防止编译器重新排序位域,否则value
的值将根据平台和可能甚至是已编译二进制文件的大小而变化。
是否有办法告诉编译器“不要重新排序这些字段”?
将类型为MyUnion
的变量声明为volatile
是否可以实现此目的?
如果union
是packed
和aligned(4)
,如果您100%确定将始终使用相同字节序的32位平台是否有可能确保位域不会重新排序?
编辑
以上内容是否只能针对一个特定的编译器进行?也就是说,是否不需要在不同的编译器之间具有兼容性。
union
对所包含的struct
中位域的顺序没有任何影响。位域在其底层存储单元(在您的情况下为uint32_t
)中分配的方向是由实现定义的。 - Ian Abbott