2012-03-20 19 views
5
class Test 
{ 
    enum{}; 
    ... 
}; 

क्या यह खाली एनम परिभाषा पोर्टेबल है? जीसीसी और एमएसवीसी में संकलन।खाली enum (enum {};) पोर्टेबल है?

+9

क्या आप इसके लिए उपयोग कर रहे हैं? – Cameron

+0

एक मैक्रो में जिसमें खाली पैरामीटर हो सकता है –

+0

यह सिर्फ एक खाली enum नहीं है, यह एक अज्ञात खाली enum है, जैसा कि अन्य उत्तरों में कहा गया है, यह खराब है क्योंकि यह कुछ भी घोषित नहीं करता है। इसलिए, खाली enums वैल्यू हैं, जो मान्य नहीं हैं अज्ञात रिक्त enums हैं। आप 'enum {ए}' और 'enum e {}' दोनों घोषित कर सकते हैं, जो मान्य घोषणाएं हैं। –

उत्तर

8

इस तरह की enum विशेष रूप से सी ++ मानक के खंड 7 अनुच्छेद 3 में बीमार गठित के रूप में सूचीबद्ध है। जीसीसी इसे स्वीकार नहीं करता है। वहाँ जीसीसी में इस के लिए बग समाधान था:

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29018

+1

मुझे वह याद आएगा। व्याकरण फॉर्म को अनुमति देता है, लेकिन अध्याय शीर्षलेख में, वास्तव में, किसी भी घोषणा की एक विशिष्ट निषेध है जो किसी प्रकार या इकाई (चर, फ़ंक्शन या संदर्भ) घोषित नहीं करती है। और इस मामले को एक उदाहरण के रूप में ठीक से देता है। –

+2

@ नवाज वीज़लफ़ॉक्स द्वारा उद्धृत अनुच्छेद सी ++ 98, सी ++ 03 और सी ++ 11 में अपरिवर्तित है और इस सटीक उदाहरण के साथ मौजूद है। –

4

C++ मानक से निम्नलिखित स्निपेट के अनुसार हम मान सकते हैं कि यह वास्तव में एक वैध बयान है:

7,2/1 गणन घोषणाओं (सी ++ 03)
...
enum-विनिर्देशक:
              enum पहचानकर्ता ऑप्ट {प्रगणक-सूची ऑप्ट}

ध्यान दें कि दोनों पहचानकर्ता और प्रगणक-सूची वैकल्पिक हैं, और वजह के रूप में एक बयान enum {} मान्य है (यदि आप मानक पूछते हैं)।


लेकिन मानक भी कहना नहीं है कि खाली घोषणाओं बीमार का गठन कर रहे हैं?

हां, और मानक से नीचे स्निपेट में enum { }; का एक उदाहरण भी है।

/3 विनिर्देशक (सी ++ 03)

इन मामलों में भी और जब भी एक वर्ग विनिर्देशक या enum-विनिर्देशक डीईसीएल-विनिर्देशक-सेक में मौजूद है, पहचानकर्ता इन विनिर्देशों में घोषणाओं द्वारा घोषित किए जाने वाले नामों में से एक हैं (कक्षा - नाम, एनम-नाम, या एन्युमेटर, वाक्यविन्यास के आधार पर)।

ऐसे मामलों में, और एक अनाम सा मैदान (9.6) की घोषणा, डीईसीएल-विनिर्देशक-सेक में कार्यक्रम एक या अधिक नामों को पेश करेगा, या एक नाम पेश किया redeclare करेगा के अलावा पिछले घोषणा द्वारा।

* उदाहरण [

enum { };   // ill-formed 
typedef class { }; // ill-formed 

* अंत उदाहरण]


निष्कर्ष

बयान बीमार हो रहा है मानक पर सावधान नजर रखने के बाद, हालांकि इंसानों द्वारा संकलक लिखे जाते हैं - और मनुष्य गलतियां करते हैं और कभी-कभी चीजों को नजरअंदाज करते हैं।


टी एल; डॉ आप, इस तरह के enum { }; के रूप में एक खाली घोषणा उपयोग नहीं करना चाहिए, भले ही यह संकलित

+0

लेकिन जैसा कि वीसेलफ़ॉक्स ने इंगित किया था, §7/​​3 में, __all__ घोषणाओं के लिए , सामान्य रूप से घोषणाओं को पर प्रतिबंध लगाने पर प्रतिबंध लगाता है जो कुछ भी घोषित नहीं करता है। यह उदाहरणों में से एक है 'enum {}; '। –

+0

@JamesKanze उत्तर अपडेट किया गया, हेड अप के लिए धन्यवाद, मैं पूरी तरह से '7.1/3' के बारे में भूल गया। –

+0

@refp मैं इसे भी याद करूँगा, जब तक वेसेलफ़ॉक्स ने इसे इंगित नहीं किया। (और अनुभाग §7/​​3 है, §7.1/3 नहीं।) –