我有一些预定义的结构体(实际上有几个),其中变量横跨32位字边界。在Linux(以及使用GCC的Windows)中,我能够使用“attribute((packed))”使我的结构体正确地打包到正确的大小。然而,我无法通过VC++和#pragma pack以相同的方式使其工作。
使用GCC,这将返回正确的6字节大小:
struct
{
unsigned int a : 3;
unsigned int b : 1;
unsigned int c : 15;
unsigned int troubleMaker : 16;
unsigned short padding : 13;
} __attribute__((packed)) s;
使用VC++,这将返回不正确的大小为8个字节。
#pragma pack(push)
#pragma pack(1)
struct
{
unsigned int a : 3;
unsigned int b : 1;
unsigned int c : 15;
unsigned int troubleMaker : 16;
unsigned short padding : 13;
} s;
#pragma pack(pop)
我可以手动跨越边界来使“troubleMaker”正常工作,但我不想这样做。有什么建议吗?