【发布时间】:2019-12-13 11:38:11
【问题描述】:
我找到了位域用于网络消息的代码。我想知道强制转换bitfield_struct data = *(bitfield_struct *)&tmp; exaclty 的作用以及它的语法是如何工作的。它不会违反严格的别名规则吗?以下是部分代码:
typedef struct
{
unsigned var1 : 1;
unsigned var2 : 13;
unsigned var3 : 8;
unsigned var4 : 10;
unsigned var5 : 7;
unsigned var6 : 12;
unsigned var7 : 7;
unsigned var8 : 6;
} bitfield_struct;
void print_data(u_int64_t * raw, FILE * f, int no_object)
{
uint64_t tmp = ntohll(*raw);
bitfield_struct data = *(bitfield_struct *)&tmp;
...
}
【问题讨论】:
-
问题在于,即使没有严格的别名,位域也会产生高度不可移植的代码。字节序、打包、字节顺序以及这些字段的所有内容都取决于特定的编译器实现。但是,是的,它也可能违反了严格的别名。能否提供更多细节,例如硬件平台和编译器?
-
我的编译器是 Ubuntu 18.04 上的 VSCode (GCC)。编译的程序运行良好,但我的问题是我不理解这个特定转换背后的语法。赋予数据什么价值?是指针吗?它指出了什么?
-
@th33lf 它可能也违反了严格的别名没有“可能” - 发布的代码违反了strict aliasing。
标签: c casting endianness bit-fields strict-aliasing