2013-10-02 17 views
6

क्या प्रीप्रोसेसर मैक्रो विस्तार को रोकने का कोई तरीका है? मेरे पास एक मौजूदा सी हैडर फ़ाइल है जो पूर्णांक के सेट को परिभाषित करने के लिए #define का उपयोग करती है और मैं इसे एक सी ++ एनम पर कॉपी करना चाहता हूं जिसमें समान मान नाम हों। उदाहरण के लिए (सी ++ 11 का उपयोग):मैक्रो विस्तार को रोकें

enum MyEnum { 
    VALUE, 
    // ... 
}; 

#define VALUE 0 

MyEnum convert(int x) { 
    if (x == VALUE) { 
    return MyEnum::VALUE; 
    } 
    // ... 
} 

निश्चित रूप से समस्या यह है कि MyEnum::VALUEMyEnum::0 है, जो एक सिंटैक्स त्रुटि का कारण बनता है में अनुवाद किया जाता है। सबसे अच्छा समाधान मैक्रोज़ को enums के साथ प्रतिस्थापित करना है, लेकिन दुर्भाग्य से यह मेरी स्थिति में एक विकल्प नहीं है।

मैंने concatenation का उपयोग करने की कोशिश की, लेकिन इससे मदद नहीं मिली (संकलक ने एक ही त्रुटि दी)।

#define CONCAT(a,b) a##b 
// ... 
return MyEnum::CONCAT(VA,LUE); // still results in MyEnum::0 

क्या कोई और समाधान है जो मुझे मैक्रो और एनम मूल्य के लिए समान नाम रखने की अनुमति देता है? शीर्ष लेख को जोड़ने के बाद

#undef VALUE 

:

+0

लंबे समय तक सम्मेलन यह है कि सभी अपरकेस मैक्रोज़ के लिए उपयोग किया जाता है, और बाकी सब कुछ कम से कम एक लोअरकेस अक्षर का उपयोग करता है। अर्थात। 'enum MyEnum {Value}'। – MSalters

उत्तर

3

आप किसी मैक्रो परिभाषित कर सकते हैं।

+2

ध्यान दें कि इससे मैक्रो को शेष फ़ाइल के लिए अपरिभाषित कर दिया जाएगा, इसलिए यदि बाद में स्रोत में मैक्रो का उपयोग किया जाना है तो इसे फिर से परिभाषित किया जाना चाहिए। –

+0

सही। यह समाधान काम नहीं करता है। –

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