pragma pack(1)也不是__attribute __((aligned(1)))有效

neo*_*eye 18 pragma llvm pack xcode4

我的代码过去常用,但现在结构大小突然是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);
Run Code Online (Sandbox Code Playgroud)

我试过不成功的使用

#pragma pack(push, 1)
/* struct ChunkStruct { ... }; */
#pragma pack(pop)
Run Code Online (Sandbox Code Playgroud)

我也试过以下,但没有运气

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)));
Run Code Online (Sandbox Code Playgroud)

如何用Xcode 4.3.1打包结构?

Wil*_*ill 28

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

struct foo {
  uint8_t bar;
  uint8_t baz;
} __attribute__((packed));
Run Code Online (Sandbox Code Playgroud)

使用__attribute__((aligned(1)))告诉编译器在下一个字节边界开始每个struct元素,但是不告诉它最后可以放多少空间.这意味着允许编译器将struct最多四倍的机器字大小进行舍入,以便更好地用于数组和类似数据.__attribute__((packed))告诉编译器根本不使用任何填充,即使在结束时也是如此struct.