2009-04-27 20 views
20

क्या सी कॉम घोषणा में अंतिम कॉमा आवश्यक है?सी एनम में अंतिम कॉमा आवश्यक है?

यानी VAL3 के बाद अल्पविराम है?

enum{Val1, Val2, Val3,} someEnum; 

वहाँ हैं/बाहर

धन्यवाद

+9

मानक सी 8 9 में, अंतिम कॉमा स्पष्ट रूप से प्रतिबंधित था। सी 99 में, वे इसे अनुमति देते हैं। इसे छोड़ने का दुष्प्रभाव यह है कि इसे सख्त सी 8 9 कंपाइलर्स द्वारा संकलित नहीं किया जा सकता है। –

उत्तर

36

इसकी आवश्यकता नहीं है।

enum-specifier: 
    enum identifieropt { enumerator-list } 
    enum identifieropt { enumerator-list , } 
    enum identifier 
enumerator-list: 
    enumerator 
    enumerator-list , enumerator 
enumerator: 
    enumeration-constant 
    enumeration-constant = constant-expression 

सूचना enum-specifier के पहले दो रूपों, अनुगामी अल्पविराम के साथ एक और एक के बिना: C99 की धारा 6.7.2.2 के रूप में वाक्य रचना सूचीबद्ध करता है।

एक लाभ यह है कि मैं इसे उपयोग करने के लिए देखा है जैसी चीजों में है:

enum { 
    Val1, 
    Val2, 
    Val3, 
} someEnum; 

जहां, आप (उदाहरण के लिए) में जोड़ने के लिए Val4 और Val5, तुम बस कॉपी और बिना Val3 लाइन पेस्ट करना चाहते हैं अल्पविराम समायोजित करने के बारे में चिंता करने के लिए।

और, जैसा कि एक टिप्पणी में बताया गया है, यह स्वचालित कोड जेनरेटर को सरल बनाना भी हो सकता है ताकि उन्हें अंतिम मूल्य के लिए विशेष हैंडलिंग न हो। वे सिर्फ प्रत्येक मूल्य को अल्पविराम के बाद आउटपुट कर सकते हैं।

यह बार-बार देखा एसक्यूएल करने के लिए likened किया जा सकता:

select fld1, fld2 from tbl where 1=1 and fld1 > 8 

उस मामले में, where 1=1 वहाँ केवल इतना है कि आप अपने पहले खंड से पहले एक where डाल करने के लिए नहीं है और एक and से पहले प्रत्येक बाद में एक। आप केवल इस तथ्य पर भरोसा कर सकते हैं कि where पहले से मौजूद है और आपके द्वारा जोड़े गए सभी के लिए बस and का उपयोग करें।

कुछ लोग इस आलस्य के reeks और वे सही हो, लेकिन जरूरी है कि एक बुरी बात :-)

किसी भी सभ्य डीबीएमएस क्वेरी अनुकूलक पर जाने से पहले इस तरह लगातार खंड को निकाल देते में सक्षम होना चाहिए नहीं है सोच सकते हैं डेटाबेस टेबल

+8

एक और तर्क जिसे मैंने इसके लिए सुना था, मशीन जेनरेटर कोड के लिए है - कोड जेनरेटर में एक कम कोने केस की आवश्यकता है। –

1

कोई इसे छोड़ने के किसी भी दुष्प्रभाव, यह आवश्यक नहीं है और कोड स्पष्टता के लिए छोड़ देना चाहिए। इसकी उपस्थिति/अनुपस्थिति का कोई प्रभाव नहीं पड़ता है।

+2

यह कहने के लिए काफी सटीक होगा कि पिछली कॉमा का कोई अर्थपूर्ण मूल्य नहीं है। इसकी अनुपस्थिति कोड रखरखाव को कम सुविधाजनक बना सकती है। पिछली कॉमा की अनुपस्थिति किस तरह से कोड स्पष्ट करती है? –

+0

जब enum का अंतिम तत्व तुरंत एक ब्रेस के बाद होता है तो यह मुझे स्पष्ट दिखता है। मुझे लगता है कि यह व्यक्तिपरक है। – sharptooth

3

नहीं, इसकी आवश्यकता नहीं है - असल में मैं कहूंगा कि यह खराब शैली है।

4

नहीं, इसकी आवश्यकता नहीं है। कारण यह है कि यह कट और पेस्ट कोड के प्रयोजनों के लिए आसान बनाता है, अगर आपको चिंता करने की आवश्यकता नहीं है कि अल्पविराम क्या है या नहीं।

3

जैसा कि पहले से ही कहा गया है कि इसकी आवश्यकता नहीं है। एक पिछला कॉमा समर्थित है इसका कारण यह है कि (यह मानते हुए कि आइटम एक लाइन में रखे गए हैं) यह आपको कट/पेस्ट या ड्रैग/ड्रॉप का उपयोग करके गणना में वस्तुओं के क्रम को आसानी से पुनर्व्यवस्थित करने की अनुमति देता है, और यह आपको भी अनुमति देता है वाक्यविन्यास त्रुटि उत्पन्न किए बिना अंतिम आइटम को टिप्पणी करने के लिए। पिछली कॉमा को छोड़ना कानूनी है लेकिन इन कोड रखरखाव के फायदे खो देता है।

मैं भूल गया था लेकिन निक काफी सही है। मैंने भी संकलक निर्देशों के साथ पिछली कॉमा का शोषण किया है। इसके बिना, सशर्त कोड बहुत गड़बड़ और पढ़ने के लिए कठिन होता।

2

यह वैकल्पिक और उपयोगी है, अगर आप कहते हैं कि मैक्रो का उपयोग करें, उदा।

#ifdef _FLAG 
    #define OPTS opt_four, opt_five, 
#else 
    #define OPTS // none 
#endif 
enum { 
    opt_one, 
    opt_two, 
    opt_three, 
    OPTS 
}; 
0

इसकी आवश्यकता नहीं है, वास्तव में कुछ संकलक शिकायत करते हैं कि आप एक जोड़ते हैं। उदाहरण के लिए विजुअल स्टूडियो 6.
सीए के लिए एक उपयोग सी मैक्रोज़ का उपयोग करके enums बनाने के लिए है।

#define ELEMENT(x) x, 

enum MyElements { 
    ELEMENT(a) 
    ELEMENT(b) 
    ELEMENT(c) 
}; 

यह पैटर्न उपयोगी है यदि आपको तत्वों के साथ कई चीजें करने की आवश्यकता है और केवल उन्हें एक बार परिभाषित करना है। इसके एक और पूर्ण उदाहरण के लिए आप libiconv और iconv उपयोगिता के कोड को देख सकते हैं।

+0

यह बुरा है। क्यों उपयोग नहीं करें: "# परिभाषित तत्व (x) x" और फिर enum में अल्पविराम जोड़ें? – nilton

+1

विचार यह है कि enum की सामग्री स्वयं एक और मैक्रो हैं: '# परिभाषित ALL_ELEMENTS (तत्व) तत्व (ए) तत्व (बी) तत्व (सी)'। फिर आप किसी भी विशेष समय पर जो कुछ भी चाहते हैं उसे '# परिभाषित करें', और उसके बाद 'ALL_ELEMENTS' मैक्रो का आह्वान करें। –

14

हर किसी की तरह कहता है, अल्पविराम की आवश्यकता नहीं है। लेकिन यह सी 99 में नया है (सी 8 9 में अनुमति नहीं थी) और सी ++ के अगले संस्करण में भी इसकी अनुमति होगी। ,

enum Items { 
    A, 
    B, 
    C, 
    LENGTH 
}; 

अब आप अपने कोडन दिशानिर्देश में डाल सकता है कि आपके गणन में अंतिम आइटम एक अल्पविराम होना चाहिए:

एक अन्य तर्क एक "लंबाई" प्रगणक और एक सामान्य प्रगणक के बीच एक अंतर बनाने के लिए है लागू, लेकिन अगर यह एक "लंबाई" आइटम नहीं है - जो सिर्फ बताता है कि कितने आइटम हैं।

यह अन्य उत्तरों की व्याख्या जैसे स्वचालित पीढ़ी के आइटम (मैक्रोज़/प्रीप्रोसेसरों का उपयोग करके) में भी मदद करता है।

+3

यह एक शर्म की बात है कि LENGTH मुहावरे स्विच (enum) की पूर्णता के लिए स्वत: जांच को तोड़ देता है। –

7

मानक सी 8 9 में, अंतिम अल्पविराम की अनुमति नहीं है। पूर्ण विराम।

यह अनुमति देने के लिए एक आम विस्तार था; विशेष रूप से, यह जीसीसी द्वारा समर्थित था, लेकिन मानक ने स्पष्ट रूप से इसे अस्वीकार कर दिया।

मानक सी 99 में, आखिरी कॉमा की अनुमति है, सरणी और संरचना प्रारंभकर्ताओं के साथ समरूपता के लिए, जो हमेशा पिछली वस्तु पर पिछली कॉमा को अनुमति देता था।

6.7.2.2 गणन विनिर्देशक

सिंटेक्स

enum-specifier: 
      enum identifieropt { enumerator-list } 
      enum identifieropt { enumerator-list , } 
      enum identifier 

अनुगामी अल्पविराम के अनुमति देने का प्राथमिक लाभ यह है कि यह (सी स्रोत) कोड की आसान मशीन पीढ़ी परमिट है - आप की जरूरत नहीं है शुरुआती सूची में अंतिम (या, शायद, पहली) आइटम के लिए विशेष केस कोड लिखना। इसलिए, Yacc और Lex जैसे प्रोग्राम, लेकिन दो नाम, थोड़ा सा सरल हो सकते हैं।

0

अन्य उत्तरों का उल्लेख है, लेकिन मैं सिर्फ यह हाइलाइट करना चाहता हूं कि पिछली कॉमा को मानकों-अनुरूप सी 8 9 और सी ++ में अस्वीकार कर दिया गया है, जो इसे पुराने या असामान्य कंपेलरों के साथ पोर्टेबिलिटी समस्या बनाता है। यहां एक उपयोगी लिंक है जो इस और कई अन्य सी/सी ++ मुद्दों को समझाता है: http://david.tribble.com/text/cdiffs.htm#C99-enum-decl

1

अंतिम पिछला कॉमा आवश्यक नहीं है।

मैं दो कारणों से पीछे चल अल्पविराम के पसंद करते हैं:

  1. स्वच्छ git diffs
  2. लाइन-आधारित कमांड वाले संपादकों में आसान संपादन (उदा। विम का dd)।
संबंधित मुद्दे