【问题标题】:Pragma Pack Ignored and __attribute__ ((aligned (2), packed)); does not have any effectPragma Pack Ignored 和 __attribute__ ((aligned (2), packed));没有任何效果
【发布时间】:2012-08-01 21:46:16
【问题描述】:

我一直在尝试查找此问题,但没有找到可行的解决方案。我的编译器忽略了 #pragma pack(push) #pragma pack(2) 和 __ 属性 __ ((aligned (2), packed)) 也不能解决问题。堆栈是 8 字节对齐的,并且想要将某些结构转换为 2 字节对齐。 -fpack-struct 有效,但它会影响所有结构。

我想使用#pragma pack。

我正在 SDK 13.3 eclipse IDE GCC #4.1.2 中编写 xilinx microblaze

我想我不明白是什么让编译器忽略了 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));

【问题讨论】:

  • 请向我们展示一些演示问题的代码。小心#pragma pack;见this question

标签: c gcc xilinx


【解决方案1】:

你可以为你的结构使用这样的东西:

struct __packed__
{
    char* member_one;
    int *member_two;
    .... 
} my_struct;

您也可以尝试使用以下方法抑制标准对齐:

int *__unaligned my_int_pointer;

希望对您有所帮助。

问候。

【讨论】:

    【解决方案2】:

    结构体大小为四个字节的原因是内部结构体包含 x 和 y 字段。使用您指定的 2 字节打包编译指示,这些字段中的每一个都将以 2 字节对齐,使联合中最长的成员为 4 字节长。

    如果紧凑性对您很重要,则将 1 字节打包与显式填充字段结合使用。在这个特定的示例中,甚至不需要填充:

    #pragma pack(push, 1)
    
    struct _Size_Test
    {
        union
        {
            struct
            {
                int8 x;
                int8 y;
            };
    
            int16 z;
        };
    } Size_Test;
    

    以下 sn-p 显示了显式填充的工作原理:

    #pragma pack(push, 1)
    
    struct _Size_Test
    {
        union
        {
            struct
            {
                int8 x;
                int8 pad1;
            };
    
            int16 z;
        };
    } Size_Test;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-30
      • 2012-01-24
      • 2012-07-31
      • 2015-11-19
      • 2014-05-10
      • 2022-01-09
      • 2016-01-15
      相关资源
      最近更新 更多