我一直在尝试查找此问题,但尚未找到有效的解决方案。我的编译器忽略了#pragma pack(push)#pragma pack(2)和__ attribute __((aligned(2),packed))也没有解决问题。堆栈是8字节对齐的,并希望将某些结构转换为2字节对齐。 -fpack-struct有效但它会影响所有结构。
我想使用#pragma pack。
我正在使用SDK 13.3 eclipse IDE GCC#4.1.2
编写xilinx微型编程器我想我不明白是什么让编译器忽略了Pragma包..我不想关闭警告我想使用它。
#pragma pack(push)
#pragma pack(2)
struct _Size_Test
{
union
{
struct{
int8 x;
int8 y;
};
int16 z;
};
}Size_Test;
#pragma pack(pop)
sizeof(Size_test)= 4,应为2
添加属性((aligned(2),packed))不起作用
struct _Size_Test
{
union
{
struct{
int8 x;
int8 y;
};
int16 z;
};
}Size_Test _attribute_((aligned(2),packed));
答案 0 :(得分:0)
你可以在你的结构中使用这样的东西:
struct __packed__
{
char* member_one;
int *member_two;
....
} my_struct;
您还可以尝试使用以下方法来抑制标准对齐:
int *__unaligned my_int_pointer;
希望得到这个帮助。
问候。
答案 1 :(得分:0)
结构大小为四个字节的原因是由于包含x和y字段的内部结构。使用您指定的2字节打包编译指示,这些字段中的每一个都将以2字节对齐,使联合中最长的成员长4个字节。
如果紧凑性对您很重要,那么将1字节打包与显式填充字段结合使用。在这个特定的例子中,甚至不需要填充:
#pragma pack(push, 1)
struct _Size_Test
{
union
{
struct
{
int8 x;
int8 y;
};
int16 z;
};
} Size_Test;
以下代码段显示了显式填充如何工作:
#pragma pack(push, 1)
struct _Size_Test
{
union
{
struct
{
int8 x;
int8 pad1;
};
int16 z;
};
} Size_Test;