2010-04-21 8 views
6

मेरे कोड बेस में मुझे लगता है कि दो मॉड्यूल में एक ही नाम के साथ संरचनाएं हैं। यह एक नाम संघर्ष त्रुटि दे रहा है। कोड बदलने के बिना इसे हल करने का कोई तरीका है?एक ही नाम के साथ दो संरचनाओं को हल करने के लिए कैसे?

+0

कोड बदलने के साथ क्या गलत है? –

+0

अगर मैं कर सकता, तो मेरे पास होगा। :) क्षमा करें नील, मेरे मामले में यह भी एक विकल्प नहीं है। मैं अपने नियंत्रण से बाहर दो अलग-अलग मॉड्यूल को एकीकृत कर रहा हूं और वे इसे पैदा कर रहे हैं। – Jay

उत्तर

9

यह एक भयानक हैक है, लेकिन यह इतना

// a.h 
struct collide { 
    int a; 
}; 

// b.h 
struct collide { 
    float b; 
}; 

// test.c 
#define collide a_collide 
#include "a.h" 
#undef collide 
#include "b.h" 
int main(){ 
    struct a_collide a; 
    struct collide b; 
    return 0; 
} 

आप शायद struct नाम बदलने के लिए दोनों हेडर देने के लिए के लिए चाहते हैं की तरह, struct के नाम फिर से परिभाषित करने मैक्रो का उपयोग करने के लिए संभव हो जाएगा त्रुटियों जब कोई अनिवार्य रूप से गलत struct का उपयोग करता है शायद

// wrap_a.h 
#define collide a_collide 
#include "a.h" 
#undef collide 

की तरह एक आवरण शीर्षक में मैक्रो यूएनडीईएफ ताकि आप अपने कोड भर यादृच्छिक प्रतिस्थापन नहीं मिलता है याद रखें।

+0

मैं इसे इतना भयानक हैक नहीं कहूंगा। एक बार मुझे अपने कार्यक्रम में दो लेक्स-जेनरेट किए गए स्कैनर शामिल करना पड़ा और उन्होंने बड़ी संख्या में प्रतीकों पर टक्कर लगी, इसलिए मैंने इसी तरह की चाल का उपयोग किया और यह एक आकर्षण की तरह काम करता था। – qrdl

+0

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

1

कोई भी अच्छा विचार दिमाग में नहीं आता है। यहाँ दो नहीं-तो-अच्छे हैं:

  • आप बहुत भाग्यशाली हैं, तो आप विभाजित कर सकते हैं अपने कोड ताकि कोई मॉड्यूल हर एक समय में संरचना के दोनों प्रकार का उपयोग करने की जरूरत है, तो केवल शामिल उचित शीर्षलेख, और दूर आप जाओ। यह संकट से भरा हुआ है और एक रखरखाव दुःस्वप्न हो सकता है: जो भी आपके पीछे आता है, वह आपके नाम और आपके सभी वंश को सातवीं पीढ़ी तक शाप देने का कारण होगा।

  • यदि कोड c89ish है तो आप एक C++ कंपाइलर के साथ संकलन करने और नामस्थान में एक या अधिक अपमानजनक संरचनाओं को लपेटने का प्रयास कर सकते हैं। यह दो भाषा (कास्टिंग नियम, class आरक्षित शब्द आदि के रूप में सभी चुनिंदा छोटे अंतरों से समस्याओं का परिचय देता है ...), इसलिए यह निश्चित रूप से कोड को बदलने के आपके अनुरोध का उल्लंघन नहीं करता है।

शुभकामनाएं।

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