2012-07-04 12 views
8

मैं इस तरह एक संरचना के साथ बिट क्षेत्र का इस्तेमाल किया है,क्या यह संघ के साथ बिट फ़ील्ड का उपयोग करने के लिए मान्य है?

struct 
{ 
     unsigned int is_static: 1; 
     unsigned int is_extern: 1; 
     unsigned int is_auto: 1; 
} flags; 

अब मैं यह देखने के लिए आश्चर्य है कि यह एक संघ के साथ किया जा सकता है यदि ऐसा है तो मैं कोड की तरह,

union 
{ 
     unsigned int is_static: 1; 
     unsigned int is_extern: 1; 
     unsigned int is_auto: 1; 
} flags; 

मैंने पाया संशोधित संघीय कार्यों के साथ थोड़ा सा क्षेत्र, लेकिन संघ में उन सभी क्षेत्रों को एक बिट को दिया जाता है जैसा कि मैं आउटपुट से समझता हूं। अब मैं देख रहा हूं कि यूनियन के साथ बिट फ़ील्ड का उपयोग करना गलत नहीं है, लेकिन ऐसा लगता है कि इस तरह इसका उपयोग करना परिचालन सही नहीं है। तो जवाब क्या है - क्या यह यूनियन के साथ बिट फ़ील्ड का उपयोग करने के लिए मान्य है?

+0

कृपया, क्या सही ढंग से काम नहीं करता है? – alk

उत्तर

12

आपको बंदूक और गोलियां दी जाती हैं। क्या यह अपने आप को पैर में शूट करना ठीक है? बेशक नहीं, लेकिन अगर आप चाहें तो कोई भी ऐसा करने से आपको रोक नहीं सकता है।

मेरा मुद्दा है, जैसे बंदूक और गोलियां, संघ और बिट फ़ील्ड उपकरण हैं और उनके पास उनका उद्देश्य, उपयोग और "दुरुपयोग" है। तो जैसा कि आपने ऊपर लिखा है, यूनियन में बिटफील्ड का उपयोग करना, पूरी तरह मान्य सी है लेकिन कोड का बेकार टुकड़ा है। यूनियन के अंदर सभी फ़ील्ड एक ही मेमोरी साझा करते हैं, इसलिए आपके द्वारा उल्लेख किए गए सभी बिटफिल्ड अनिवार्य रूप से एक ही ध्वज हैं क्योंकि वे समान स्मृति साझा करते हैं।

12

यह मान्य है लेकिन जैसा कि आपने पाया है, उतना उपयोगी नहीं है जितना आपने इसे किया है।

आप ऐसा कुछ कर सकते हैं ताकि आप झंडे का उपयोग कर एक ही समय में सभी बिट्स को रीसेट कर सकें।

union { 
    struct { 
     unsigned int is_static: 1; 
     unsigned int is_extern: 1; 
     unsigned int is_auto: 1; 
    }; 
    unsigned int flags; 
}; 

या आप कुछ इस तरह कर सकते हैं:

union { 
    struct { 
     unsigned int is_static: 1; 
     unsigned int is_extern: 1; 
     unsigned int is_auto: 1; 
    }; 
    struct { 
     unsigned int is_ready: 1; 
     unsigned int is_done: 1; 
     unsigned int is_waiting: 1; 
    }; 
}; 
+1

मैंने कुछ अर्धविराम जोड़े हैं जो मानते हैं कि आप अज्ञात संरचनाएं चाहते थे। यह भी ध्यान रखें कि वे मानक सी नहीं हैं। जीसीसी में, आपको इन कार्यों के लिए '-fms-extension' का उपयोग करना होगा। – unkulunkulu

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

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