编译包(1)和__attribute__((排列(1)))的作品(pragma pack(1) no

2019-06-24 01:04发布

用我的代码在过去的工作,但现在的结构大小突然为16个字节。 它使用的是13个字节。 我最近在Xcode 4.2升级到4.3.1 Xcode中(4E1019)。

#pragma pack(1)
struct ChunkStruct {
    uint32_t width;
    uint32_t height;
    uint8_t bit_depth;
    uint8_t color_type;
    uint8_t compression;
    uint8_t filter;
    uint8_t interlace;
};
#pragma pack()
STATIC_ASSERT(expected_13bytes, sizeof(struct ChunkStruct) == 13);

我曾尝试使用unsuccesfully

#pragma pack(push, 1)
/* struct ChunkStruct { ... }; */
#pragma pack(pop)

我也曾尝试以下,但没有运气

struct ChunkStruct {
    uint32_t width;
    uint32_t height;
    uint8_t bit_depth;
    uint8_t color_type;
    uint8_t compression;
    uint8_t filter;
    uint8_t interlace;
} __attribute__ ((aligned (1)));

如何包装结构和Xcode 4.3.1?

Answer 1:

Xcode使用所述gccclang编译器都使用其__attribute__((packed))来指定结构填料。

struct foo {
  uint8_t bar;
  uint8_t baz;
} __attribute__((packed));

使用__attribute__((aligned(1)))告诉编译器,开始下一个字节边界上的每个结构元素,但不告诉它有多少空间可以放在最后。 这意味着,编译器允许舍入struct到机器字大小的倍数为在阵列和类似更好地利用。 __attribute__((packed))告诉编译器不使用任何填充可言,甚至在结束struct



文章来源: pragma pack(1) nor __attribute__ ((aligned (1))) works