好吧,我认为人们不应该误认为 C99 规范违反了语言标准。
该标准仅表示转换的结果可能无法跨不同的机器/架构移植。
只要您将程序编码为在特定架构上工作,就可以了。
例如,我将唯一标识对象(即键)的数据结构 DataStr_t 的选择性成员分组到另一个结构中,例如 DataStrKey_t。我将确保 sizeof(DataStrKey_t) 等于 sizeof(uint64) 并且出于所有实际目的将其用作 uint64,因为它易于处理。
我也经常做以下操作:
memcmp(&var_uint64, &var_DataStructKey, sizeof(uint64));
如果您使用机器上的键对对象进行读访问或写访问,则转换产生的值是可预测的,并且按位对齐是一致的。好吧,如果您将“仅此数据”移动到另一台机器(实际上并没有写入数据)并尝试读取它,事情可能会中断。
您的程序稍作修改以获得更多解释和成功编译:这里,只要 LINE_A 和 LINE_B 在同一台机器上执行,结果总是可以预测的。但是,如果您将 (var_uint64,var_DataStructKey) 写入文件并从另一台机器读取它,然后对这些填充的值执行 LINE_B,则比较“可能”会失败。
#include <stdio.h>
#include <string.h>
typedef unsigned long U32;
typedef struct hello_s
{
U32 a:8;
U32 b:24;
}hello_t;
int main()
{
hello_t str;
U32 var;
str.a = 0xAA;
str.b = 0xAAA;
var = *(U32 *)(&str); //LINE_A
if(0 == memcmp(&var, &str, sizeof(U32))) //LINE_B
printf("var : %lu\n", var);
return 0;
}
我想我的回答为时已晚,但试图解释。