2012-04-15 11 views
13

एक लंबे समय पहले मान लीजिए, मैं बनाया था निम्नलिखित गणन:कैसे ObjectiveC में पदावनत किया जा रहा के रूप में एक enum मूल्य घोषित करने के लिए (2.0)

typedef enum 
{ 
    GeometricPoint, 
    GeometricLine, 
    GeometricSquare, 
    GeometricRectangle, 
    GeometricCircle 
}GeometricFigures; 

मैं उन कुछ समय पहले शुरू की मेरी भयानक इंजन के भीतर और अब मैंने अंततः निर्णय लिया है कि लोगों को GeometricSquare का उपयोग नहीं करना चाहिए क्योंकि यह पहले से ही GeometricRectangle द्वारा कवर किया गया है।

एक शुरुआत के लिए, मैं संभवतः मेरी गणन कुछ की दिशा में इस तरह बदल जाएगा:

typedef enum 
{ 
    GeometricPoint, 
    GeometricLine, 
    GeometricRectangle, 
    GeometricSquare = GeometricRectangle, 
    GeometricCircle 
}GeometricFigures; 

कि निश्चित रूप से मेरी भयानक इंजन पीछे की ओर संगत रखेंगे लेकिन दूसरी ओर विरासत कबाड़ वृद्धि हुई है। इसलिए मैं एक निकट भविष्य में GeometricSquare को पूरी तरह से हटाना चाहता हूं। मेरे इंजन के उपयोगकर्ताओं के लिए यह स्पष्ट करने के लिए, मैं GeometricSquare को बहिष्कृत के रूप में चिह्नित करना चाहता हूं।

मेरा लक्ष्य यह है कि प्रलेखन (डॉक्सिजन) के साथ-साथ कोड पूर्णता (एक्सकोड) और अंतिम लेकिन कम से कम संकलक (जीसीसी) उपयोगकर्ता को यह स्पष्ट नहीं करेगा कि GeometricSquare का उपयोग अब और नहीं किया जाना चाहिए GeometricRectangle द्वारा।

प्रलेखन के लिए, मैं बस @deprecated कीवर्ड का उपयोग करूंगा;

typedef enum 
{ 
    GeometricPoint, 
    GeometricLine, 
    GeometricRectangle, 
    ///@deprecated Has been replaced by GeometricRectangle 
    GeometricSquare = GeometricRectangle, 
    GeometricCircle 
}GeometricFigures; 

लेकिन एक्सकोड और जीसीसी के बारे में कैसे?

दुर्भाग्यवश, सामान्य जीसीसी (विधि) विशेषता नौकरी नहीं लगती है। नीचे दिए गए ड्राफ्ट के रूप में __attribute__((deprecated)) जोड़ना एक वाक्यविन्यास त्रुटि का कारण बनता है।

typedef enum 
{ 
    GeometricPoint, 
    GeometricLine, 
    GeometricRectangle, 
    GeometricSquare = GeometricRectangle __attribute__((deprecated)), 

पार्स मुद्दा उम्मीद}

GeometricCircle 
}GeometricFigures; 

तो जाहिर है कि या तो पूरी तरह काम नहीं करता है या मैं बस गलत उपयोग कर रहा हूँ।

+1

संभव डुप्लिकेट ++ अंकुरित मूल्य के रूप में चिह्नित करें?] (http://stackoverflow.com/questions/5488057/c-mark-enum-value-as-deprecated) – lpapp

उत्तर

17

मुझे लगता है कि आप असाइनमेंट ऑपरेटर के गलत पक्ष में __attribute__ बिट संलग्न कर रहे हैं।

typedef enum 
{ 
    GeometricPoint, 
    GeometricLine, 
    GeometricRectangle, 
    GeometricSquare __attribute__((deprecated)) = GeometricRectangle, 
    GeometricCircle 
}GeometricFigures; 

और अब GeometricSquare बताए एक संकलक चेतावनी देता है::

int fig = GeometricSquare; //'GeometricSquare' is deprecated 
+0

इतना आसान, बहुत बहुत धन्यवाद - पूरी तरह से ठीक काम करता है। – Till

+0

इसका उपयोग करते समय सावधान रहें: ऊपर दिए गए उदाहरण में यह पूरी तरह से काम करता है क्योंकि बराबर मामला तत्काल पिछला है (rawValue = 2) तो 'जियोमेट्रिक स्क्वायर' को 2 को भी असाइन किया गया है, और सर्कल 2 + 1 = 3 है। हालांकि, मान लीजिए कि हमारे पास 'जियोमेट्रिक स्क्वायर = जियोमेट्रिक पॉइंट' था। फिर दोनों में rawValue = 0 होगा, और उद्देश्य-सी सर्कल में 0 + 1 = 1 असाइन करेगा।हालांकि, 'जियोमेट्रिकलाइन' भी 1 है, जिससे अप्रत्याशित परिणाम होता है कि 'जियोमेट्रिक सर्कल = जियोमेट्रिकलाइन'। – Gobe

+0

हां, उन्हें एक दूसरे के बगल में रहने की जरूरत है। –

12

बाद में किसी समय एक सुविधा मैक्रो जोड़ा गया है: यह ठीक से काम करने लगता है

typedef NS_ENUM(NSInteger, GeometricFigures) 
{ 
    GeometricPoint, 
    GeometricLine, 
    GeometricRectangle, 
    GeometricSquare __deprecated_enum_msg("Squares are for squares. Use GeometricRectangle.") = GeometricRectangle, 
    GeometricCircle, 
}; 
[ग की
+0

अच्छा, जानना अच्छा - ty! – Till

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

  • कोई संबंधित समस्या नहीं^_^