2009-10-26 4 views
6
namespace ValueType { 
    enum Enum { 
    Boolean = 0, 
    Float = 1, 
    Double, 
    SInt = 8, 
    SLong, 
    UInt = SInt + (1 <<4), 
    ULong = SLong + (1 << 4) 
    }; 
} 
+0

मुझे यह भी पता नहीं था कि लीगल था ... साफ –

+3

यह वास्तव में आत्म-संदर्भ नहीं है। आपके पास कुछ सदस्य हैं जो पहले परिभाषित सदस्यों का संदर्भ दे रहे हैं। यहां नियम सामान्य हैं - एक बार यह परिभाषित हो जाने पर, यह दिखाई देता है। –

+0

मैंने आपके बिंदु को दर्शाने के लिए प्रश्न अपडेट किया। धन्यवाद। :) – Geoff

उत्तर

12

हां - आवश्यकता यह है कि यह एक अभिन्न निरंतर अभिव्यक्ति है। सी ++ मानक निम्न उदाहरण में शामिल हैं:

enum { d, e, f=e+2 }; 
+0

जब मैंने आपका उत्तर और पावेल ऊपर देखा तो मुझे तुरंत बढ़ावा और मेटा प्रोग्रामिंग की याद दिला दी गई, मुझे यह कैसे याद नहीं आया? हे। धन्यवाद। :) – Geoff

+0

बूलियन का उपयोग करना भी संभव है: ** enum {yes = true, no =! Yes}; ** – fmuecke

+0

हाँ, सी ++ के नियमों के अनुसार, * अभिन्न प्रकार * में "बूल, चार, wchar_t, हस्ताक्षरित और हस्ताक्षरित पूर्णांक प्रकार ", और" बूल मान अभिन्न प्रकार के रूप में व्यवहार करते हैं। " –

1

रूप Jerry से कहा, यह कानूनी है।

कुछ दुर्लभ मामलों में इसके क्रोध को पता है कि गणनाकर्ताओं के प्रकार को केवल गणना के बाद ही निर्दिष्ट किया गया है। मानक गणनाओं के प्रकार के बारे में निम्नलिखित बताता है (7.2/4):

प्रत्येक गणना एक प्रकार को परिभाषित करती है जो अन्य सभी प्रकारों से अलग होती है। एनम-विनिर्देशक के समापन ब्रेस के बाद, प्रत्येक गणक के पास इसकी गणना का प्रकार होता है। समापन ब्रेस से पहले, प्रत्येक गणक का प्रकार इसके शुरुआती मूल्य का प्रकार है। यदि एक प्रारंभकर्ता को एक गणक के लिए निर्दिष्ट किया गया है, तो प्रारंभिक मान अभिव्यक्ति के समान प्रकार है। यदि पहले गणक के लिए कोई प्रारंभकर्ता निर्दिष्ट नहीं है, तो प्रकार एक अनिर्दिष्ट अभिन्न प्रकार है। अन्यथा यह प्रकार पिछले अंक के प्रारंभिक मान के प्रकार जैसा ही है जब तक कि वृद्धिशील मान उस प्रकार में प्रतिनिधित्व योग्य नहीं है, इस स्थिति में प्रकार एक अनिर्धारित अभिन्न प्रकार है जो बढ़ी हुई मान को शामिल करने के लिए पर्याप्त है।

प्रकाश डाला वाक्य निम्न उदाहरण में दिखाया जा सकता है:

enum E { 
    E0   // Unspecified type 
    , E1 = E0-1 // -1, or MAX_UINT 
    , E2   // 0 or (MAX_UINT+1) 
}; 

असल में, प्रकार E0 के लिए चुना E1 के परिणामस्वरूप मूल्य को प्रभावित करता है।

+0

समझने योग्य और तार्किक, मुझे नहीं लगता कि कोई प्रारंभिक मूल्य क्यों नहीं देगा। ऐसा करने से आपको संकलक के कार्यान्वयन की दया पर ध्यान दिया जाता है। इसका स्पष्ट उदाहरण; एमएसवीसी 2008 में, आपका ई उत्पादन करता है: ई 0 (0), ई 1 (-1), ई 2 (0)। – Geoff

+0

इस तरह के व्यवहार के साथ-साथ लोग कभी-कभी मानते हैं कि संकलक समझदार होगा। और निश्चित रूप से, समझदार है * वे * होने की उम्मीद है। –