2009-03-29 24 views
11

के साथ एक मान का आकलन जीसीसी सी 99टाइपपीफ एनम,

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

typedef enum { 
    TYPE_DATE, 
    TYPE_TIME, 
    TYPE_MONEY, 

    TYPE_COUNT, 
    TYPE_UNKNOWN = TYPE_COUNT 
} string_type_e; 

क्यों TYPE_COUNT है और यही कारण है कि TYPE_UNKNOWN करने के लिए TYPE_COUNT आवंटित?

किसी भी सुझाव के लिए बहुत धन्यवाद,

उत्तर

17

डिफ़ॉल्ट रूप से, enums स्वचालित रूप से कंपाइलर द्वारा 0 से शुरू होने वाले पूर्णांक मान दिए जाते हैं। तो तारीख शून्य, समय एक और पैसा दो होगा। अगला मान 'psuedo' enum value TYPE_COUNT को दिया जाता है, जिसे मान तीन दिया जाएगा, जो 'उचित' enum मानों की संख्या होती है।

TYPE_UNKNOWN एक और मूल्य है जो किसी 'उचित' मान का प्रतिनिधित्व नहीं करता है, इसलिए परीक्षण e < TYPE_COUNT में विफल हो जाएगा। TYPE_COUNT के बराबर होने का अर्थ यह है कि प्रत्येक अलग सार्थक मूल्य संगत है, लेकिन मुझे उसमें कोई महत्वपूर्ण लाभ नहीं है (अगर TYPE_COUNT 2 की शक्ति से कम था, तो यह प्रभावित हो सकता है कि संकलक किस प्रतिनिधित्व का उपयोग कर सकता है , और मूल्यों सन्निहित है, लेकिन यह वास्तव में, कोई फर्क नहीं पड़ता के रूप में आप वैसे भी पिछले TYPE_COUNT उन्हें नहीं बढ़ाते हैं)

+0

क्या मैं 0x2 और 0xfffe जैसे मूल्यों को नामांकित स्थिरांक में एनम में असाइन कर सकता हूं? – Namratha

+1

@Namratha आप कर सकते हैं, और यह काफी आम है जहां उनका कुछ प्रोटोकॉल है जहां मूल्य दूसरे घटक के साथ इंटरफ़ेस के हिस्से के रूप में तय किए जाते हैं।ऐसे मामलों में आप शायद अंत में 'TYPE_COUNT' जैसे कुछ का उपयोग नहीं करेंगे, जब तक कि मान संगत न हों तब तक आप उन पर भरोसा नहीं करेंगे। –

6

Enum मान मूल रूप से पूर्णांक स्थिरांक हैं। डिफ़ॉल्ट रूप से उन्हें enum + 1 (और पहले तत्व के लिए 0) में अंतिम तत्व का मान दिया जाता है। जब आप तत्वों को गिनना चाहते हैं, जो इसे किसी सरणी या किसी चीज़ के साथ मैप करने के लिए उपयोगी हो सकता है, तो इस तरह घोषित enum की (जो गतिशील रूप से अपडेट की जाएगी यदि आप इससे कुछ जोड़ते हैं या हटाते हैं), तो आप एक COUNT स्थिर रख सकते हैं इसके अंत में (TYPE_COUNT आपके उदाहरण में)। Enum में अमान्य मानों को अलग करने में सक्षम होने के लिए, आप एक और स्थिर घोषित करना चाहेंगे। आपके उदाहरण में, वह निरंतर गिनती निरंतर के बराबर होगा, जो आपके मूल्य के सबसे बड़े मूल्य से बड़ा मान है।

3

टाइप_count क्यों है और type_unknown टाइप टाइप क्यों करें?

enum के लिए अधिकतम स्वीकृत मान पर एक टैब रखने के लिए। याद रखें, अन्यथा यह जांचने का कोई तरीका नहीं होगा कि कोई दिया गया मान सही है (सीमा के भीतर) या नहीं।

+0

लेकिन एक enum की सीमा के भीतर अंतराल और ओवरलैप हो सकता है - उदाहरण में नहीं, सुनिश्चित करने के लिए, लेकिन सामान्य रूप से enums में। –

+0

@ जोनाथन: अगर लेखक अंतर्निहित अनुक्रम में अंतराल के साथ एक enum डिजाइन कर रहे थे, तो एक गिनती निरंतर परिभाषित करने की यह विधि बेकार होगी। तो उत्तरार्द्ध के लिए इच्छुक एक लेखक पूर्व के रूप में सरल से बच जाएगा। – Shog9

2

TYPE_COUNT एक सरणी enum के तत्वों द्वारा अनुक्रमित आयाम करने के लिए सेवा कर सकते हैं अपने 'अच्छा':

type_info my_info[TYPE_COUNT]; 

या लूप के बाहर निकलने की स्थिति में उपयोग किया जा सकता है। TYPE_UNKNOWN का उपयोग किसी प्रकार के लिए अवैध या अपरिभाषित मान का प्रतिनिधित्व करने के लिए किया जा सकता है (-1 इसके मूल्य के लिए TYPE_COUNT का विकल्प हो सकता है)।

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