我认为人们不应该错误地认为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);
if(0 == memcmp(&var, &str, sizeof(U32)))
printf("var : %lu\n", var);
return 0;
}
我想我的答案可能有些晚了,但我还是试着解释一下。