2011-09-15 27 views
7

निम्न पाठ C Programming Language, 2nd Edition से एक अंश, सी भाषा के निर्माता द्वारा लिखित है (ताकि मुझे लगता है कि यह सही है):सी संकलक द्वारा जांच की गई enum क्यों नहीं है?

हालांकि enum प्रकार के चर घोषित किया जा सकता है, compilers जाँच करें कि जरूरत नहीं है इस तरह के चर में आप जो स्टोर करते हैं वह गणना के लिए मान्य मान है।

  1. सी भाषा में क्या मामलों संकलक एक enum का मूल्य की जाँच नहीं करता के लिए:

मैं कुछ संदेह है?

  • enum स्थिरांक किसी कारण से चेक नहीं किए जाते हैं। क्यों नहीं? कारण क्या हैं?
  • enum संकलक द्वारा चेक नहीं किया गया है, enum त्रुटि-प्रवण का उपयोग कर रहा है? कृपया समझाएँ।
  • +0

    एक करीबी वोट क्यों? –

    +1

    किसी ने सोचा कि यह एक प्रश्न/प्रश्न/432 9 37/net-why-arent-enums-range-value-check का डुप्लिकेट था। उन्होंने शायद अपना दिमाग बदल दिया (जवाब वही है, लेकिन प्रश्न सभी के बाद एक अलग भाषा के बारे में है), लेकिन एक करीबी वोट को हटाने के लिए संभव नहीं है। –

    उत्तर

    8
    1. एक गणन एक फैंसी पूर्णांक की तरह है, और यह स्थिरांक या निरंतर मूल्यों आप संग्रहीत करना चाहते हैं के लिए नामों के रूप में पूर्वप्रक्रमक मैक्रो की एक पूरी लोड को परिभाषित करने की तुलना में बेहतर है, क्योंकि एक संकलक (या संपादक) कर सकते हैं जांचें कि आप सही प्रकार के साथ जाने के लिए सही नाम और मान का उपयोग कर रहे हैं। दूसरी तरफ, केवल एक int होने के नाते, आपको उस मूल्य में डालने से रोक नहीं है जिसके लिए आपने नाम नहीं बनाया है, जो कभी-कभी उपयोगी होता है।

    2. उन्हें हर मामले में चेक नहीं किया जा सकता है। क्या होगा यदि आप एनम-टाइप किए गए चर में रखे जाने वाले मान को प्राप्त करने के लिए दो नंबर जोड़ते हैं? यह रनटाइम पर जेनरेट किया गया कोई भी मूल्य हो सकता है, इसलिए इसे चेक नहीं किया जा सकता है (कम से कम ओवरहेड के बिना)।

    3. सी में सबकुछ असुरक्षित है; व्यावहारिक रूप से कोई सुविधा नहीं है जो संकलक आपको पूरी तरह दुरुपयोग से रोक सकता है। enums सुरक्षित हैं क्योंकि वे प्रोग्रामर त्रुटि और भ्रम को रोकने में प्रभावी हैं, क्योंकि वे आपको बेवकूफ कुछ नहीं रोकते हैं।

    +0

    'एनम' के बारे में दूसरी बड़ी बात यह है कि कुछ कंपाइलर्स आपको चेतावनी देते हैं कि आपके पास 'स्विच' ब्लॉक है जो 'एनम' पर स्विच करता है, और आप 'केस' क्लॉज में से एक को छोड़ देते हैं। – detly

    +0

    मुझे लगता है कि कुछ कंपाइलरों के बारे में एक परेशान चीज, 'enum' के बारे में एक बड़ी बात नहीं है। यह बहुत संभव है और यहां तक ​​कि संभावना है कि एक निश्चित 'स्विच' केवल अन्य मूल्यों से इनकार करते हुए पहले तर्क के आधार पर संभव 'enum' मानों का एक सबसेट संभालता है ... –

    +0

    @R ..: उस * अहम * मामले में, आप कर सकते हैं चेतावनी को चुप करने के लिए बस 'डिफ़ॉल्ट:/* त्रुटि हैंडलाइन कोड */'जोड़ें। –

    6

    तब आप उस प्रकार

    enum status status; 
    

    का एक उद्देश्य को परिभाषित करने और बिटवाइज़ करने या कुछ 'सरल' के सेट की तरह

    enum status { 
        ST_READY = 1 << 0, /* 1 */ 
        ST_WAIT = 1 << 1, /* 2 */ 
        ST_ERROR = 1 << 2, /* 4 */ 
        ST_HALT = 1 << 3, /* 8 */ 
        ST_ETC = 1 << 4, /* 16 */ 
    }; 
    

    एक enum कर सकते हैं स्थितियां

    status = ST_WAIT | ST_ERROR; /* recoverable error */ 
    

    ध्यान दें कि मूल्य ST_WAIT | ST_ERRORहैऔर वह मान enum का हिस्सा नहीं है।


    आपके सवालों के जवाब के लिए:

    1. सी संकलक प्रोग्रामर पैर में खुद को गोली मार देता है।
    2. सी कंपाइलर प्रोग्रामर को पैर में खुद को शूट करने देता है।
    3. सी कंपाइलर प्रोग्रामर को पैर में खुद को शूट करने देता है।
    +0

    +1 सी आपको लगता है कि आप क्या कर रहे हैं, और आपको इसे यथासंभव कुशल तरीके से प्राप्त करने देता है - यह भी: g/foot/s // head/ – asc99c

    +1

    @ asc99c: मैं इसे ' % s/foot/head/g' – pmg

    +0

    @pmg क्या आप कह सकते हैं '1 << 0' इस परिणाम का क्या महत्व है? –

    1

    1) क्या सभी मामले की सी में भाषा संकलक मूल्य की जाँच नहीं करता की तरह के रूप में enum चिंतित है करता है पर।

    मैं समझ नहीं पा रहा हूं कि आप अपने जनजाति से बात करते हैं।

    1) सी भाषा में सभी मामलों में कंपाइलर एनम के मूल्य की जांच नहीं करता है। [संपादित]

    जब आप इसे असाइन करते हैं। नंगे पूर्णांक से असाइनमेंट की अनुमति है, ताकि आप यह कर सकें:

    enum E { A, B } x; 
    x = 10000; 
    

    संकलक त्रुटि के बिना। इसके अलावा, en12 में switch ईएस थकावट की जांच नहीं कर रहे हैं।

    2) क्यों कुछ कारणों से enum स्थिरांक की जांच नहीं की जाती है? उन कारण क्या हैं?

    लोग इन्हें पूर्णांक रखना पसंद करते हैं। जैसे।

    enum E { END_OF_EVERYTHING = 5 }; 
    

    जहां 0-4 सामान्य मान के रूप में हैं, और 5 एक प्रकार का विशेष है।

    3) चूंकि एनम कंपाइलर द्वारा चेक नहीं किया गया है, तो enum का उपयोग कर त्रुटि प्रवण है?

    हां।

    enum E { A = 1, B = -1 }; 
    

    इस enum केवल (डेटा के 2 टुकड़े शामिल महत्व देता -2, -1, 0, 1: के बाद से enums केवल बिट्स कि सभी enum मान ले जा सकते हैं की कम से कम संख्या के मूल्यों है, तो आप अजीब परिणाम प्राप्त कर सकते)। यदि आप इसमें 10000 असाइन करते हैं, तो अजीब चीजें हो सकती हैं (वास्तव में देखी गई)।

    +0

    इस कोड में 'enum E {ए = 1, बी = -1};', आप कैसे कह सकते हैं कि मान -2 हैं, -1,0 , 1? –

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