2012-04-29 26 views
17

Mój kod był używany do pracy w przeszłości, ale teraz rozmiar struktury nagle wynosi 16 bajtów. Kiedyś było 13 bajtów. Niedawno zaktualizowałem program z Xcode 4.2 do Xcode 4.3.1 (4E1019).Pakiet pragma (1) ani __attribute__ ((wyrównany (1))) działa

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

Próbowałem unsuccesfully użyciu

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

Próbowałem również następujące, ale bez powodzenia

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

Jak spakować konstrukcjom z Xcode 4.3.1?

Odpowiedz

24

Xcode używa kompilatorów gcc i clang, które używają __attribute__((packed)) do oznaczania wypełnienia strukturalnego.

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

Korzystanie __attribute__((aligned(1))) informuje kompilator, aby rozpocząć każdy element struct na następnej granicy bajtów, ale nie mówi się, ile miejsca można go umieścić na końcu. Oznacza to, że kompilator może zaokrąglać liczbę do rozmiaru słowa maszynowego, aby lepiej wykorzystać ją w tablicach i podobnych. __attribute__((packed)) mówi kompilatorowi, aby w ogóle nie używał dopełnienia, nawet pod koniec struct.