2013-04-24 9 views
6

मैं निम्नलिखित संघ का उपयोग बाइट, निबल और बिट आपरेशन को आसान बनाने:सी ++ गुमनाम structs

union Byte 
{ 
    struct { 
    unsigned int bit_0: 1; 
    unsigned int bit_1: 1; 
    unsigned int bit_2: 1; 
    unsigned int bit_3: 1; 
    unsigned int bit_4: 1; 
    unsigned int bit_5: 1; 
    unsigned int bit_6: 1; 
    unsigned int bit_7: 1; 
    }; 

    struct { 
    unsigned int nibble_0: 4; 
    unsigned int nibble_1: 4; 
    }; 

    unsigned char byte; 
}; 

यह अच्छा काम करता है, लेकिन यह भी इस चेतावनी उत्पन्न करता है:

चेतावनी: आईएसओ सी ++ गुमनाम पर प्रतिबंध लगाता है structs [-pedantic]

ठीक है, जानना अच्छा है। लेकिन ... इस चेतावनी को मेरे जी ++ आउटपुट से कैसे प्राप्त करें? क्या इस मुद्दे के बिना इस संघ की तरह कुछ लिखने की संभावना है?

+2

क्यों बस अपने struct का नाम नहीं? –

+3

आप वैध सी ++ के क्षेत्र में जो भी करने की कोशिश कर रहे हैं वह करने में सक्षम नहीं होंगे। यह काम कर सकता है, लेकिन यह अपरिभाषित व्यवहार होगा। –

+0

मैं इसे नाम दे सकता हूं - उदाहरण के लिए संरचना nibbles और इसे एक संघ का एक क्षेत्र बनाते हैं। लेकिन फिर मुझे इसे Byte.nibbles.nibble_0 तक पहुंचाना होगा। यह उपयोग करने के लिए इतना अच्छा नहीं होगा;)। – Dejwi

उत्तर

4

जीसीसी कंपाइलर विकल्प -fms-extensions चेतावनी के बिना गैर मानक अज्ञात structs की अनुमति देगा।

(यही कारण है कि सक्षम बनाता है यह क्या समझता है "माइक्रोसॉफ्ट एक्सटेंशन")

आप भी इस परंपरा का उपयोग करके वैध सी ++ में एक ही प्रभाव को प्राप्त कर सकते हैं।

union Byte 
{ 
    struct bit { 
    unsigned int _0: 1; 
    unsigned int _1: 1; 
    unsigned int _2: 1; 
    unsigned int _3: 1; 
    unsigned int _4: 1; 
    unsigned int _5: 1; 
    unsigned int _6: 1; 
    unsigned int _7: 1; 
    }; 
    struct nibble { 
    unsigned int _0: 4; 
    unsigned int _1: 4; 
    }; 
    unsigned char byte; 
}; 
इस के साथ

, अपने गैर मानक byte.nibble_0 हो जाता है कानूनी byte.nibble._0

+2

आप अग्रणी अंडरस्कोर के बारे में सही हैं। अंडरस्कोर से शुरू होने वाले वैश्विक नामस्थान में नाम कार्यान्वयन के लिए आरक्षित हैं। अंडरस्कोर से शुरू होने वाले नामों के बाद एक अपरकेस अक्षर होता है या जिसमें डबल अंडरस्कोर होते हैं, वे कार्यान्वयन के लिए भी आरक्षित होते हैं। - 17.6.4.3.2 देखें (सी ++ 11) –

संबंधित मुद्दे