2012-12-07 59 views
5

मुझे enum के कितने तत्वों के अनुसार एक सरणी आवंटित करने की आवश्यकता है।क्या एएनएसआई-सी में सदस्य एरे का आकार हो सकता है?

enum { A, B, C, LAST }; 
char buf[LAST]; 

कि ठीक काम करता है, यहां तक ​​कि -ansi -pedantic झंडे के साथ: मैं निम्नलिखित किया था। लेकिन मुझे यकीन नहीं है कि यह एक जीसीसी या क्लैंग है (जो सबसे अधिक समर्थन करता है, अगर सभी जीसीसी-एक्सटेंशन नहीं) एक्सटेंशन या वास्तव में एएनएसआई सी मानक द्वारा अनुमत है और एएनएसआई-सी स्टडी के साथ किसी भी सी कंपाइलर में ठीक काम करेगा। क्या कोई इसे स्पष्ट कर सकता है?

उत्तर

6

दोनों सी 8 9 (सेक्शन 3.5.2.2) और सी 99 (सेक्शन 6.7.2.2) मानक निश्चित

6.7.2.2 गणन विशिष्ट ईआरएस (पैराग्राफ 3), http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf

3.5.2.2 गणन विनिर्देशक (पैराग्राफ 3), http://flash-gordon.me.uk/ansi.c.txt

दोनों पढ़ने: ई उसी तरह enums :

[...] = def nes के साथ एक गणक निरंतर अभिव्यक्ति के मूल्य के रूप में इसकी गणना निरंतर है।यदि पूर्ववर्ती गणक के पास कोई = नहीं है, तो इसके गणना का मान निरंतर 0 है। प्रत्येक अनुवर्ती गणनाकर्ता को इसके गणना को निरंतर अभिव्यक्ति के मूल्य के रूप में निरंतर अभिव्यक्ति के मूल्य के रूप में निरंतर अभिव्यक्ति के मान के रूप में निरंतर अभिव्यक्ति के मान के रूप में स्थिर किया जाता है। [...]

इसलिए, आपके वाक्यविन्यास में, कोई मानक-अनुपालन संकलक आपके कोड को सही तरीके से चलाएगा।

2

कि ठीक काम करता है, यहां तक ​​कि -ansi -pedantic झंडे

साथ तो यह एक जीएनयू विस्तार नहीं है। हां, यह एएनएसआई सी में ठीक है, क्योंकि enum के सदस्य निरंतर अभिव्यक्तियां हैं।

+0

यह मानता है कि जीसीसी 100% मानक अनुपालन है :-) –

1

सी स्टैंडर्ड, पैरा 6.2.5 से (प्रकार):

16 एक गणन नामित पूर्णांक निरंतर मूल्यों का एक सेट शामिल हैं। प्रत्येक विशिष्ट गणना एक अलग समेकित प्रकार का गठन करती है।

17 प्रकार चार, हस्ताक्षरित और हस्ताक्षरित पूर्णांक प्रकार, और गणित प्रकार सामूहिक रूप से पूर्णांक प्रकार कहा जाता है।

इसके अलावा, पैरा 6.7.2.2 (गणन विनिर्देशक):

अभिव्यक्ति है कि एक गणना स्थायी का मूल्य को परिभाषित करता है एक पूर्णांक के रूप में एक मूल्य प्रदर्शनीय है कि एक पूर्णांक निरंतर अभिव्यक्ति होगी।

2

क्या कोई इसे स्पष्ट कर सकता है?

मुझे यकीन है कि आप जानते हैं, एक enum सिर्फ एक संख्या के लिए एक लेबल appling रहा है: तो वास्तव में

enum 
{ A, // 0 
    B, // 1 
    C, // 2 
    LAST // 3 
}; 

:

char buf[3]; 
:

char buf[LAST]; 

से अलग नहीं है

2

जैसा कि अन्य ने कहा है, यह मान्य है। लेकिन मुझे लगता है कि अब तक किसी ने भी सही वर्गों को उद्धृत नहीं किया है। N1256 C99 draft से प्रासंगिक हैं: 6.6 "लगातार भाव" पैरा 6:

एक पूर्णांक लगातार expression99) पूर्णांक प्रकार होगा और केवल ऑपरेंड कि पूर्णांक स्थिरांक, गणन स्थिरांक हैं होगा [...]

और फिर 6.7.5.2 "सरणी declarators" पैरा 4: आकार एक पूर्णांक निरंतर अभिव्यक्ति और तत्व प्रकार एक ज्ञात स्थिर आकार, सरणी प्रकार एक चर लंबाई सरणी प्रकार नहीं है गया है

हैं [...]

तो मूल रूप से:

  • गणन स्थिरांक निरंतर भाव
  • सरणी होने के लिए नहीं चर लंबाई के लिए
  • हैं, हम एक निरंतर अभिव्यक्ति की जरूरत

मुझे लगता है कि 6.7.2.2 का मानना ​​है कि " गणना विनिर्देशक "जो अन्य ने enum घोषित करने के बारे में वार्ता का हवाला दिया, गणनाकर्ताओं का उपयोग नहीं किया। बेशक, जब उन्हें घोषित करते समय आपको संकलन समय स्थिरांक की आवश्यकता होती है, तो हम उम्मीद करते हैं कि अभिव्यक्तियों में उपयोग किए जाने पर उन्हें समय स्थिरांक भी संकलित करना चाहिए।

+1

धन्यवाद। आप पिछले उत्तरों के बारे में सही हैं जो मानक से सही वर्गों को उद्धृत नहीं करते हैं। मुख्य अवधारणा यह साबित करना था कि घोषणा समय पर एक एनम मूल्य और सरणी का आकार बिल्कुल वही मूल्य है। – cesss