2010-02-17 8 views
7

मैं एक कोड के रूप में इस प्रकार हैint के अलावा अन्य प्रकार के बिट-फ़ील्ड?

typedef struct my{ 
    const char *name; 
    uint8_t is_alpha : 1; 
    uint8_t is_hwaccel : 1; 
    uint8_t x_chroma_shift; 
    uint8_t y_chroma_shift; 

} mystr; 

uint8_tunsigned char को typedef'ed है जो थोड़ा-क्षेत्रों घोषित उपयोग करता है।

imgconvert.c(60) : warning C4214: nonstandard extension used : bit-field types other than int.
  1. वहाँ किसी भी समस्याओं/संभावित समस्याओं के पूर्णांक के अलावा अन्य प्रकार बिट क्षेत्रों का उपयोग करने में है:

    MS-वी.एस. 2008 में कोड का निर्माण इस बिट फ़ील्ड का उपयोग कर के रूप में नीचे एक चेतावनी देता है? चेतावनी क्यों?

  2. सी 99 सी भाषा विनिर्देश द्वारा अनुमत इंट टाइप बिट-फिल्ड्स के अलावा अन्य हैं?
+1

चेतावनी बहुत आत्म-व्याख्यात्मक है: __nonstandard एक्सटेंशन used__; आपके कोड में पोर्टेबिलिटी समस्याएं हो सकती हैं। –

+0

@ मेहर्राड: प्रकार int का उपयोग पोर्टेबिलिटी पहलुओं से केवल तभी उपयोगी होता है जब सभी लक्ष्यों/कंपाइलर के आकार के इन्स होते हैं। – goldenmean

+0

आप यहां बिटफील्ड के बारे में लिख रहे हैं, उनका आकार कोड में निर्दिष्ट है। – AProgrammer

उत्तर

4

1] क्या int के अलावा अन्य प्रकार के बिट फ़ील्ड का उपयोग करने में कोई समस्या/संभावित समस्याएं हैं? चेतावनी क्यों?

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

2] सी 99 सी भाषा विनिर्देश द्वारा अनुमत इंट टाइप बिट-फिल्ड्स के अलावा अन्य हैं?

C99 के ड्राफ्ट से:

6.7.2.1 संरचना और संघ विनिर्देशक

4 थोड़ा-क्षेत्र एक प्रकार है कि है के एक योग्य या अयोग्य संस्करण होगा _Bool, हस्ताक्षरित int, हस्ताक्षरित int, या कुछ अन्य कार्यान्वयन-परिभाषित प्रकार।

+7

क्या "कुछ अन्य कार्यान्वयन-परिभाषित प्रकार" मानक मानकों में उल्लेखनीय रूप से बेकार नहीं है? –

+0

@ नील बटरवर्थ: एटीएम, मेरे पास अभी मसौदा है। हालांकि वास्तविक को देखने की आवश्यकता होगी। लेकिन, हाँ, मुझे लगता है कि आप सही हैं। – dirkgently

+0

@ डिर्कर्जली: प्रकार int का उपयोग पोर्टेबिलिटी पहलुओं से केवल तभी उपयोगी होता है जब सभी लक्ष्यों/कंपाइलर की समान आकार की इन्सेट की गारंटी हो। क्या यह एक उचित धारणा है। मैं नहीं जानता कि मैं क्यों पूछ रहा हूं। – goldenmean

1

int का उपयोग क्यों नहीं करें? बिटफील्ड का वास्तविक कार्यान्वयन कंपाइलर से कंपाइलर में भिन्न होता है। यदि आप पोर्टेबल कोड लिखना चाहते हैं, तो int का उपयोग करें। यदि आप एक छोटी संरचना, या बाइट्स की एक निश्चित संख्या की संरचना बनाना चाहते हैं, या एक संरचना जहां बिट्स निश्चित स्थिति में हैं, तो बिटफील्ड का उपयोग न करें। uint8_t सदस्य को flags जैसे कुछ कहा जाता है और बिटमैस्क के रूप में उपयोग करने के लिए मैक्रोज़ को परिभाषित करता है।

+0

आपका मतलब है 'हस्ताक्षरित int'। 'uint8_t' हस्ताक्षरित है, 'int' हस्ताक्षरित है, उन्हें मिलाकर कोई अच्छा नहीं है। – kennytm

+0

मैंने व्यक्तिगत रूप से कोड में बिटफील्ड का उपयोग नहीं किया है, लेकिन यदि यह 1-बिट बिटफील्ड है, तो क्या इससे कोई फर्क नहीं पड़ता? – tomlogic

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