2011-06-08 22 views
6

क्या होता है यदि दो अलग-अलग libs एक ही enum परिभाषित करते हैं और मुझे एक ही परियोजना में दोनों libs का उपयोग करने की आवश्यकता है?विरोधाभासी enums

enum महीना {जनवरी = 0, फरवरी, ... दिसंबर}

धन्यवाद।

पीएस यह सी नामस्थान नहीं है। मैं उन्हें अलग रखने में सक्षम नहीं होगा। कुछ कामकाज की ज़रूरत है।

यह enum linkage क्या है? आंतरिक या बाहरी? सी ++ परियोजना में सी libs इस्तेमाल किया। सी ++ टैग लागू होता है।

+2

आशा है कि दो libs अलग-अलग नामस्थानों का उपयोग करें? – GWW

+4

यह वास्तव में प्रकार, चर या कार्यों की कई विरोधाभासी परिभाषाओं के लिए अलग नहीं है। –

+1

क्या यह सी या सी ++ है? वे एक भाषा नहीं हैं। –

उत्तर

5

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

#define Month File_A_Month 
#include "file_a.h" 
#define Month File_B_Month 
#include "file_b.h" 
#undef Month 

फ़ाइल में, Month का उपयोग न करें, केवल File_A_Month या File_B_Month। मैं इस अभ्यास की मानकों-शुद्धता के बारे में निश्चित नहीं हूं।

आपको संघर्षों को रोकने के लिए समान रूप से सभी enum सदस्यों को परिभाषित करना पड़ सकता है, और शायद आप files_a_and_b.h नामक फ़ाइल में इस बुराई हैकरी को रखना चाहते हैं। बेशक, आपके मामले में परिभाषाएं समान हैं, इसलिए आपको इसका सहारा लेने की आवश्यकता नहीं है, लेकिन मैं कम उत्तरदायी वंश के लिए यह उत्तर यहां छोड़ रहा हूं।

+0

+1, उस बारे में सोचा नहीं था। –

+1

+1। यह बुरा है, लेकिन मैं सावधान रहने की कोशिश करूंगा। – pic11

+0

समान गणना निरंतर नाम परिभाषा समान होने पर भी नाम संघर्ष का कारण बनेंगे। लेकिन, जैसा कि बताया गया है, प्रत्येक enum नामों के लिए मैक्रो हैक लागू करना चाल करेगा। –

11

सी libs सी ++ परियोजना में उपयोग किया जाता है। सी ++ टैग

लागू होता है क्योंकि वे सी ++ परियोजनाओं में इस्तेमाल कर रहे हैं जब के रूप में सी ++ कोड में शामिल करने, तो आप नाम स्थान का उपयोग कर सकते हैं:

// C files 
//libone.h 
enum Month {January=0, February, ..., December} 

//libtwo.h 
enum Month {January=0, February, ..., December} 

/////////////////////////////////////////////////////////////////// 
//C++ files 

//lib.hpp 
namespace LibOne 
{ 
    #include "libone.h" 
} 
namespace LibTwo 
{ 
    #include "libtwo.h" 
} 

//Usage in C++ 
LibOne::Month m1 = LibOne::January; 
LibTwo::Month m2 = LibTwo::January; 
+0

+1। लेकिन मेरे पास बहुत अधिक कोड है जो पहले ही lib_1 का उपयोग करता है। – pic11

+0

@ pic11: मुझे नहीं पता कि आपकी कोड संरचना कैसी है। लेकिन एक बात निश्चित है, जब भी आप अपनी सी ++ परियोजनाओं में एक नई लाइब्रेरी जोड़ते हैं, जो नाम-विवादों का कारण बनता है, तो आप हमेशा एक अलग नामस्थान में नई लाइब्रेरी को शामिल कर सकते हैं। – Nawaz

+0

मैं सी ++ एपीआई लिख रहा हूं और एक ही enum पहले से ही मेरे lib के नामस्थान में परिभाषित किया गया है। उपयोगकर्ता कोड मेरे एपीआई को एनम वैल्यू पास कर सकता है जो बदले में सी एपीआई के समान मूल्य पास करता है। – pic11

2

आदर्श रूप में, दो अलग अलग नामस्थान में हैं।

अन्यथा, आप एक संकलन इकाई में दोनों परिभाषाओं से बचने में सक्षम हो सकते हैं।

EDIT: ठीक है, आप सी में हैं, इसलिए आपके पास नामस्थान नहीं हैं, और ऐसा लगता है जैसे आप एक ही संकलन इकाई में दोनों परिभाषाओं का संदर्भ देना चाहते हैं। अगले चरण:

  • क्या उनके पास बिल्कुल वही परिभाषा है?
  • क्या आपके पास पुस्तकालयों में से किसी के नाम पर कोई प्रभाव है?
  • क्या आप वाकई एक अलग संकलन इकाई में उनमें से किसी के संदर्भ को छुपा नहीं सकते हैं?
+0

परिभाषाएं समान हैं। – pic11

+4

@pic: यदि परिभाषाएं समान हैं, तो कोई समस्या नहीं होनी चाहिए। –

+0

@ ओली। हां, जब तक दो libs की परिभाषाओं को एक ही अनुवाद इकाई में शामिल नहीं किया जाता है तब तक कोई समस्या नहीं है। – pic11

4

न तो enum ही है और न ही गणन स्थिरांक वस्तुओं रहे हैं, इसलिए वे कोई संबंध नहीं है - इस संबंध में, वे struct टैग या typedef नाम की तरह कर रहे हैं।

इसका मतलब है आप दो तरीके दिए है:

  • , सुनिश्चित करें प्रत्यक्ष या परोक्ष रूप कि परस्पर विरोधी हेडर कभी नहीं कर रहे हैं, एक ही अनुवाद इकाई (.c फ़ाइल) में #include घ; या
  • विरोधाभासी नाम बदलने के लिए एक या दोनों शीर्षकों को लॉन्डर करें।

हेडर लॉंडरिंग या तो नाम बदलने के साथ हेडर की एक निजी प्रति बनाकर या Chris Lutz's answer में प्रीप्रोसेसर का उपयोग करके किया जा सकता है।

+0

+1। उद्धरण: * सुनिश्चित करें कि विरोधाभासी शीर्षलेख कभी, प्रत्यक्ष या परोक्ष रूप से नहीं हैं, # उसी अनुवाद इकाई में शामिल * – pic11

0

उद्धरण: मैं सी ++ एपीआई लिख रहा हूं और उसी एनम को पहले से ही मेरे lib के नामस्थान में परिभाषित किया गया है।

तो इनमें से एक enums आपकी लाइब्रेरी के नामस्थान के अंदर है? तब आपको कोई समस्या नहीं होनी चाहिए। आपके द्वारा उपयोग की जाने वाली सी लाइब्रेरी वैश्विक नेमस्पेस में है, आपकी लाइब्रेरी का अपना नामस्थान है, और जब तक आप सही चीज करते हैं, तो दोनों कभी टकरा नहीं जाएंगे। निम्नलिखित पूर्ण रूप से मान्य है, मेरा मानना ​​है:

extern "C" { 
    #include "foo.h" 
    // enum Month { January, February, December }; 
} 

namespace mylib { 
    enum Month { Chaos, Discord, Confusion, Bureaucracy, Aftermath }; 

    Month convert(::Month c_month); 
} 

void foo() { 
    ::Month month = December; 
    mylib::Month result = mylib::convert(month); 
} 
संबंधित मुद्दे