2012-04-29 32 views
17

काम करता है मेरा कोड अतीत में काम करता था, लेकिन अब संरचना आकार अचानक 16 बाइट्स है। यह 13 बाइट्स होता था। मैंने हाल ही में एक्सकोड 4.2 से एक्सकोड 4.3.1 (4E1019) में अपग्रेड किया है।प्रागमा पैक (1) और न ही __attribute__ ((गठबंधन (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 के साथ structs पैक करने के लिए?

उत्तर

24

Xcode gcc और clang compilers जो दोनों __attribute__((packed)) का उपयोग struct पैकिंग नामित करने के लिए उपयोग करता है।

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

__attribute__((aligned(1))) का उपयोग संकलक बताता अगले बाइट सीमा पर प्रत्येक struct तत्व शुरू करने के लिए, लेकिन यह नहीं बताता है कितनी जगह यह अंत में डाल सकते हैं। इसका मतलब यह है कि संकलक को struct को सरणी और इसी तरह के बेहतर उपयोग के लिए मशीन शब्द आकार के एक से अधिक तक जाने की अनुमति है। __attribute__((packed)) संकलक को struct के अंत में, किसी भी पैडिंग का उपयोग न करने के लिए कहता है।