18

我的代码过去可以正常工作,但现在结构体大小突然变为 16 字节。它曾经是 13 个字节。我最近从 Xcode 4.2 升级到 Xcode 4.3.1 (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);

我尝试使用不成功

#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 打包结构?

4

1 回答 1

30

Xcode 使用gccclang编译器,它们都用于__attribute__((packed))指定结构打包。

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

Using__attribute__((aligned(1)))告诉编译器从下一个字节边界开始每个结构元素,但没有告诉它最后可以放置多少空间。这意味着允许编译器将其struct向上舍入为机器字长的倍数,以便更好地用于数组和类似内容。__attribute__((packed))告诉编译器根本不使用任何填充,即使在struct.

于 2012-04-29T10:11:35.667 回答