2012-04-29 7 views
17

Mein Code verwendet, um in der Vergangenheit zu arbeiten, aber jetzt ist die Strukturgröße plötzlich 16 Bytes. Es war einmal 13 Bytes. Ich habe kürzlich von Xcode 4.2 auf Xcode 4.3.1 (4E1019) aufgerüstet.pragma pack (1) noch __attribute__ ((aligned (1))) funktioniert

#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); 

habe ich versucht, unsuccesfully

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

mit Ich habe auch die folgende versucht, aber kein Glück

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))); 

Wie structs mit Xcode 4.3.1 zu packen?

Antwort

24

Xcode verwendet die Compiler gcc und clang, die beide __attribute__((packed)) zur Bezeichnung der Strukturpackung verwenden.

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

__attribute__((aligned(1))) Mit teilt dem Compiler jedes Struktur-Element auf der nächsten Byte-Grenze beginnen sie aber nicht sagen, wie viel Platz es am Ende setzen können. Dies bedeutet, dass der Compiler die struct bis zu einem Vielfachen der Maschinenwortgröße runden kann, um ihn besser in Arrays und ähnlichem zu verwenden. __attribute__((packed)) weist den Compiler an, selbst am Ende der struct keine Auffüllung zu verwenden.

Verwandte Themen