2012-12-03 9 views
12

जीसीसी को यह कहना संभव है कि इसे संरचना के लिए पैडिंग का उपयोग नहीं करना चाहिए। यह __attribute__((packed)) का उपयोग करके किया जाता है।एलएलवीएम के लिए पैक की गई संरचना (पैडिंग के बिना) कैसे घोषित करें?

typedef struct { 

    uint8_t startSymbol; 
    uint8_t packetType; 
    uint32_t deviceId; 
    uint16_t packetCRC; 

} PacketData __attribute__((packed)); 

हालांकि, नवीनतम एक्सकोड एलएलवीएम का उपयोग करता है और विशेषता को पहचानता नहीं है। एलएलवीएम के लिए पैक की गई संरचना को कैसे परिभाषित किया जाए?

समस्या का पूरा विवरण पाया जा सकता है here

अद्यतन मैं Xcode 4.5.1 का उपयोग कर रहा आईओएस जो का उपयोग करता है एप्पल LLVM 4.1 संकलक के लिए। मुझे उपरोक्त कोड उदाहरण में एक्सकोड में "पैक किया गया" विशेषता अनदेखा हो रही है।

+0

क्या मुझे कुछ याद आ रहा है या यह एक बहुत ही नई सुविधा हटाने है? पिछली बार मैंने चेक किया था, क्लैंग समर्थित '__attribute __ ((पैक किया गया)) ... –

+0

क्लैंग सटीक वही '__attribute __ ((पैक))' pragma का समर्थन करता है ... – birryree

+0

कोई जानकारी नहीं है :) मैं एक्सकोड 4.5 का उपयोग कर रहा हूं। आईओएस के लिए 1 जो ऐप्पल एलएलवीएम 4.1 कंपाइलर का उपयोग करता है। – Centurion

उत्तर

21

क्या आप वास्तव में इसे आजमाते थे? मैंने बस अपनी मशीन पर इसका परीक्षण किया, और __attribute__((packed))clang का उपयोग करके ठीक संकलित किया।

संपादित करें: मैं एक ही चेतावनी ("चेतावनी: पैक विशेषता अप्रयुक्त") मिल गया

typedef struct { 
    int a; 
    char c; 
} mystruct __attribute__((packed)); 

के लिए और इस मामले sizeof(mystruct) में 8.

हालांकि

, था

typedef struct __attribute__((packed)) { 
    int a; 
    char c; 
} mystruct; 

बस ठीक काम किया, और sizeof(mystruct) था 5.

निष्कर्ष: ऐसा लगता है कि इस काम को प्राप्त करने के लिए विशेषता को संरचना लेबल को आगे बढ़ाने की आवश्यकता है।

+0

हाँ, मैंने अभी यह किया है। मैं आईओएस के लिए एक्सकोड 4.5.1 का उपयोग कर रहा हूं जो ऐप्पल एलएलवीएम 4.1 कंपाइलर का उपयोग करता है। मुझे एक्सकोड – Centurion

+0

@ कंटूरियन में "पैक किया गया" विशेषता अनदेखा हो रही है, फिर चेतावनी चल रही है या नहीं, यह देखने के लिए 'आकार (पैकेटडेटा)' जांचें। लिनक्स पर क्लैंग प्रगति को ठीक से संभालती है। – chrisaycock

+0

@Centurion क्या इसका मतलब यह नहीं है कि यह मान्यता प्राप्त/समर्थित है जिसका उपयोग नहीं किया जाता है? क्या आप वास्तव में कोड में कहीं भी संरचना को तुरंत चालू कर रहे हैं? –

5

आप struct के लिए बाइट संरेखण निर्दिष्ट करने के लिए पूर्वप्रक्रमक निर्देश उपयोग कर सकते हैं ताकि कोई गद्दी संकलक द्वारा किया जाएगा:

#pragma pack(1)

typedef struct{
char t1;
long long t2;
char t3;
}struct_size_test;

#pragma options align=reset

स्टैक ओवरफ्लो पर this प्रश्न का उत्तर देखें।

0

बजना 3.5 लिनक्स पर -

typedef struct __attribute__((packed)) thing1 { int blah; } THING_ONE;

काम किया।

+0

पहले से ही यह बताते हुए एक जवाब था, क्यों एक और जोड़ें? – Johan