2012-11-02 7 views
7

संकलन समय पर एक enum सदस्य का मूल्य प्राप्त करना संभव है?संकलन समय पर एनम सदस्य का मूल्य प्राप्त करना संभव है?

वास्तव में, मैं इस तरह कुछ करने के लिए सक्षम होना चाहते हैं:

enum { 
    FOO_FIRST = -1, 
    FOO_A, 
    FOO_B, 
    FOO_C, 
    FOO_LAST 
}; 

#if FOO_LAST > 10 
//... 
#else 
//.. 
#endif 

मुझे पता है कि cpp चर, बुरा वाक्य रचना, आदि के बारे में पता नहीं है, केवल # (दाएं) से शुरू होने वाली चीजें? लेकिन एक enum के सदस्यों के पास निश्चित आकार है और इसे 10 (निरंतर पूर्णांक) मान की तरह बदला नहीं जा सकता है और संकलक इसके आकार और मूल्यों को जानता है। तो, क्या ऐसी तुलना करने की कोई संभावना नहीं है (जैसा मैंने ऊपर किया था)? जीसीसी-एक्सटेंशन भी बहुत सराहना की जाती है।

यह #define एस का उपयोग करके मेरी सभी गणनाओं को फिर से लिखने का प्रयास नहीं है और कुछ समय मैक्रोज़ परिवर्तन करने में मेरा समय न लें।

+1

आप अपने '# if' ब्लॉक के अंदर क्या करने की कोशिश कर रहे हैं? – ecatmur

+0

किसी भी वास्तविक उपयोग के मामले में, जहां इस उपयोगी है के बारे में सोच नहीं कर सकते .. –

+0

[enum और #define] (http://stackoverflow.com/questions/136946/difference-between-enum-and-define-statements) – SparKot

उत्तर

7

बस if का उपयोग करें। संकलन समय पर ठीक से मूल्यांकन किया जा सकता है। संकलक असंभव शाखाओं बाहर अनुकूलित करेंगे:

if (FOO_LAST > 10) { 
    // A 
} else { 
    // B 
} 

संकलक जानता दो शाखाओं (ए और बी) की जो नहीं पहुँचा जा सकता, तो यह पूरी तरह से समाप्त कर सकते हैं if

नोट हालांकि, आपको केवल गणनाकर्ताओं का उपयोग करना चाहिए। उदाहरण के लिए, इस में के लिए:

int num = FOO_LAST; 
if (num > 10) { 
    // A 
} else { 
    // B 
} 

जीसीसी रखेंगेif तुलना।

+0

बहुत अच्छा। मैं कोशिश कर रहा हूँ। क्या आपके पास ऐसे अनुकूलन विवरण के साथ एक लिंक है? (हम जीसीसी पर बात कर रहे हैं?) – Jack

+1

इसे देखने के लिए इसे देखें: http://stackoverflow.com/questions/11281471/disable-if0-elimination-in-gcc आपको इसे प्राप्त करने के लिए अनुकूलक को भी सक्षम करने की आवश्यकता नहीं है व्यवहार। असेंबली फ़ाइल प्राप्त करने के लिए '-O2 -S' के साथ एक उदाहरण प्रोग्राम संकलित करें। आप देखेंगे कि कोई शाखा नहीं है। –

+0

आपको बहुत बहुत धन्यवाद। आपने मेरा दिन बचाया :) – Jack

3

#ifdef पूर्वप्रक्रमक द्वारा और संकलक द्वारा नहीं समझा जाता है। प्री-प्रोसेसर को enums के मानों के बारे में कुछ भी पता नहीं है। तो यह जाने का कोई तरीका नहीं है।

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