2012-08-31 23 views
15

हालांकि __attribute__ ((aligned)) जैसे typedef घोषणा के साथ अच्छी तरह से काम करता है:क्या __attribute__ ((__packed__)) टाइप किए गए घोषणा पर अनदेखा किया गया है?

typedef struct __attribute__((__aligned__(8))) A { 

    xxx ip ; 
    xxx udp ; 
    xxx ports ; 
} table ; 

मैं बयान जो कहना है कि इस typedef साथ __attribute__ ((__packed__)) के साथ ऐसा नहीं है भर में आ गए हैं! मैं कुछ संबंधित प्रश्नों के माध्यम से जा रहा था और उनमें से कुछ ने टाइपेडफ के साथ पैक की गई विशेषता का उपयोग किया है जो हमारे कोड के साथ लम्बा है।

अब, हमारा कोड में हम

typedef struct { 
    xxx ip ; 
    xxx udp ; 
    xxx ports ; 
}__attribute__((packed)) table ; 

परिभाषित ऊपर घोषणा चुपचाप को संकलक बनाता है पैक विशेषता घोषणा डंप?

पीएस: हाँ, मैं इसे सत्यापित कर सकता था, लेकिन इस समय मेरी परिस्थितियां अलग-अलग हैं। छुट्टियां और स्मार्टफोन कहें!

उत्तर

1

आप यहां दो बयान जोड़ रहे हैं।

पहले आप कुछ गुणों के साथ एक संरचना को परिभाषित करते हैं। फिर आप इसके लिए उपनाम बनाते हैं।

जैसा कि आप उपनाम में पैक की गई संपत्ति असाइन करते हैं, इस उपनाम द्वारा उपयोग की गई पहले से बनाई गई डेटा संरचना को बदला नहीं जाएगा। (आमतौर पर आप "स्ट्रक्चर ब्लै" और "s_bla" ["टाइपेडफ स्ट्रक्चर ब्लै {} s_bla" द्वारा बनाए गए चर के साथ चर बना सकते हैं और इन मानों को एक-दूसरे के बीच बदल सकते हैं। यदि टाइपपीफ का उपयोग करके संरचना को बदलना संभव होगा, तो यह समेकन टूट जाएगा।)

तो: घोषणा रद्द हो जाएगी।

0

इस तरह प्रयास करें। यह काम कर सकता है।

struct test 
{ 
unsigned char field1; 
unsigned short field2; 
unsigned long field3; 
}__attribute__((__packed__)); 

typedef struct test test_t; 

test_t var1, var2; 
9

घोषणा मुझे ठीक लगता है!

इसे इन तरीकों में से एक में घोषित किया जा सकता है।

#include <stdio.h> 

    typedef struct __attribute__((packed)) { 
    char old; 
    int ip; 
    int new; 
} NCO; 

int main(void) { 

printf("%d",sizeof(NCO)); 
} 

या

#include <stdio.h> 
    typedef struct { 
    char old; 
    int ip; 
    int new; 
} __attribute__((packed)) NCO; 

int main(void) { 

printf("%d",sizeof(NCO)); 
} 

सुनिश्चित करें कि __attribute__((packed)) कीवर्ड और विशेषता विनिर्देश तुरंत संरचना घोषणा के दायां कोष्ठक (}) इस प्रकार है। यदि यह किसी अन्य स्थिति में है (जैसे, संरचना उदाहरण से पहले संरचना उदाहरण के बाद), संकलक __attribute__((packed)) को अनदेखा कर देगा और एक चेतावनी संदेश जारी करेगा।

हालांकि यह हमें पैक आकार 9 देता है, मुझे लगता है कि here के रूप में इसे टालना बेहतर है और पुराने स्कूल संरचना घोषणा शैली को आजमाएं।

+0

वाह यह काम करता है, यह अविश्वसनीय रूप से खतरनाक है, idk क्यों यह अभी भी एक बात है। – Dmitry

6

आपकी घोषणा बिल्कुल सही प्रतीत होती है, लेकिन यह संकलक-निर्भर है। उदाहरण के लिए यदि आप मिनजीडब्लू कंपाइलर को सम्मान देना चाहते हैं, तो आपको अपने प्रोग्राम को -mno-ms-bitfields पैरामीटर के साथ संकलित करना होगा। यदि आप इस ध्वज को निर्दिष्ट नहीं करते हैं, तो कोई चेतावनी जारी नहीं की जाती है, लेकिन विशेषता को सम्मानित नहीं किया जाता है!