enum

2014-06-14 9 views
10

में "div" की घोषणा कर सकते हैं नहीं मैं निम्नलिखित के रूप में बुनियादी गणित कार्यों के साथ एक enum की घोषणा करना चाहते हैं:enum

enum Operations 
{ 
    div, 
    mul, 
    add, 
    sub 
}; 

लेकिन संकलक इस घोषणा के बारे में शिकायत के रूप में div सी में एक आरक्षित कीवर्ड ++ है। मैं इसे कैसे ओवरराइड कर सकता हूं? या कोई समाधान है?

error: ‘div’ redeclared as different kind of symbol /usr/include/stdlib.h:158: error: previous declaration of ‘div_t div(int, int)’

+0

हाँ, मेरी टिप्पणी में बदल गया। –

+0

यह एक सी ++ आरक्षित कीवर्ड नहीं है, यह में घोषित एक फ़ंक्शन पहचानकर्ता है। Div_ या div जैसे किसी अन्य नाम का चयन करें। आप div div_ को परिभाषित कर सकते हैं, लेकिन ऐसा करने से आप div फ़ंक्शन तक पहुंच खो देंगे। –

उत्तर

22

div शब्द नहीं है, बल्कि एक मानक पुस्तकालय समारोह, cstdlib में संभवतः stdlib.h में घोषित कर दिया और:

त्रुटि संदेश यह।

सबसे सरल समाधान विभिन्न पहचानकर्ताओं का उपयोग करना है। अन्यथा, आप एक scoped गणन उपयोग कर सकते हैं: क्योंकि div एक समारोह cstdlib में घोषणा की, और का नाम है

enum class Operations 
{ 
    div, 
    mul, 
    add, 
    sub 
}; 

यह Operations गुंजाइश (Operations::div, Operations::mul आदि)

6

में enum के मूल्यों डाल देंगे वैश्विक स्तर पर एक अनिश्चित गणना छोड़ी जा सकती है। इसका मतलब है कि आप div का उपयोग एक गणना के रूप में नहीं कर सकते हैं।

सी ++ 11 में

, scoped गणन इस स्थिति

enum class Operations 
{ 
    div, 
    mul, 
    add, 
    sub 
}; 

के लिए शुरू की है और आप तो उपयोग कर सकते हैं Operations::div

2

आप एक नया नाम स्थान बना सकते हैं:

#include <stdlib.h> 

namespace a 
{ 
    enum Operations 
    { 
     div, 
     mul, 
     add, 
     sub 
    }; 
} 

int main() 
{ 
    a::div; 
    return 0; 
} 
+1

इंडेंटिंग? मैं टैब के बजाय रिक्त स्थान का उपयोग करने का सुझाव देता हूं। –

+1

अधिकांश कोड संपादकों पर एक टैब-टू-स्पेस रूपांतरण है –

0

उपयोग cstdlib , stdlib.h, सी ++ में नहीं। और वैश्विक नामस्थान में std नेमस्पेस आयात न करें (यानी, using namespace std का उपयोग न करें)। फिर आपके enum के साथ टकराव करने के लिए वैश्विक नामस्थान में div नहीं होगा।

+0

इससे कोई फर्क नहीं पड़ता। दुर्भाग्यवश, 'cstdlib' et al को वैश्विक नामस्थान में नाम लाने की अनुमति है। यह बुरा है, लेकिन यह वही तरीका है। – juanchopanza

+0

@juanchopanza: हाँ, मुझे लगता है कि मुझे याद है कि अभ्यास में। यह बुरा है, मैं इसे और भी मजबूत कहूंगा, यह इस सामान को 'std' नेमस्पेस में पहली जगह में डालने के उद्देश्य को पूरी तरह से नष्ट कर देता है। हां, यदि आप चाहें तो 'std :: div' का संदर्भ ले सकते हैं। लेकिन आप अभी भी अपने प्रोग्राम में किसी भी पहचानकर्ता को सुरक्षित रूप से उपयोग नहीं कर सकते हैं (उदाहरण के लिए किसी वर्ग या नामस्थान के नाम के रूप में) यह जांच किए बिना कि यह किसी भी नाम से संघर्ष नहीं करता है जिसे कुछ (रिकर्सिवली)? में हेडर फ़ाइल शामिल किया गया है। –

+0

@MarcvanLeeuwen यह पूर्व सी ++ 11 "खराब व्यवहार" होता था, और इसकी अनुमति है। लेकिन ध्यान दें कि यह सी मानक पुस्तकालय में 'कुछ.h' समकक्षों के साथ 'csomething' शीर्षकों पर लागू होता है। अधिकांश नाम पुराने और प्रसिद्ध हैं, और सी ++ मानक पुस्तकालय की तुलना में बहुत कम हैं। – juanchopanza