2012-04-29 5 views
17

Mon code utilisé pour travailler dans le passé, mais maintenant la taille de la structure est soudainement de 16 octets. Il avait l'habitude d'être 13 octets. J'ai récemment mis à jour de Xcode 4.2 à Xcode 4.3.1 (4E1019).pragma pack (1) ni __attribute__ ((aligned (1))) fonctionne

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

J'ai essayé unsuccesfully utilisant

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

J'ai aussi essayé ce qui suit, mais pas de chance

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

Comment emballer struct avec Xcode 4.3.1?

Répondre

24

Xcode utilise les compilateurs gcc et clang qui utilisent tous les deux __attribute__((packed)) pour désigner le compactage struct.

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

L'utilisation __attribute__((aligned(1))) indique au compilateur de commencer chaque élément struct à la limite de l'octet suivant, mais ne dit pas à quel point l'espace, il peut mettre à la fin. Cela signifie que le compilateur est autorisé à arrondir le struct jusqu'à un multiple de la taille du mot machine pour une meilleure utilisation dans les tableaux et similaires. __attribute__((packed)) indique au compilateur de ne pas utiliser de remplissage du tout, même à la fin du struct.

Questions connexes