2012-04-29 22 views
17

我的代码曾经工作过,但现在结构大小突然变为16字节。它曾经是13个字节。我最近从Xcode 4.2升级到Xcode 4.3.1(4E1019)。编译指示包(1)也没有__attribute__((aligned(1)))工作

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

回答

24

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

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

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

相关问题