2010-05-24 33 views
23

मैंने अपनी फ़ाइल में कुछ कॉन्स वर्ण जोड़े हैं। मुझे जो त्रुटि मिलती है वह डुप्लिकेट प्रतीक _xyz (कहना) है। इसके साथ क्या समस्या है और मैं इससे कैसे बाहर निकल सकता हूं।डुप्लिकेट प्रतीक त्रुटि सी ++

const char* xyz = "xyz"; 
class Abc 
{ 
public: 
    Abc() 
    { 
    } 
}; 

उत्तर

37

यह एक हेडर फाइल में है, तो आप हर बार जब आप #include यह xyz तय कर रहे हैं।

आप घोषणा को @ आर सैमुअल क्लैचको शो के रूप में बदल सकते हैं। हमेशा की तरह (अगर डेटा नहीं है const) इस तरह है:

Abc.h में:

extern char *xyz; 

Abc.cpp में:

char *xyz = "xyz"; 

संपादित

जोड़ने के लिए

ध्यान दें कि हेडर गार्ड नहीं इस समस्या को हल करें:

#ifndef XYZ_H 
#define XYZ_H 
... 
#endif 

हैडर गार्ड "redefinition" त्रुटियों को रोकते हैं, जहां एक ही संकलन इकाई में एक ही प्रतीक दो बार प्रकट होता है। यह कंपाइलर त्रुटि है।

लेकिन फिर भी हेडर के साथ रक्षा करता है xyz की परिभाषा अभी भी हर स्रोत फ़ाइल है कि यह शामिल है में दिखाई देगा, एक "डुप्लिकेट प्रतीक" त्रुटि है, जो एक लिंकर त्रुटि है के कारण।

मूल पोस्टर ने निश्चित रूप से इसका उल्लेख किया होगा तो यह अधिक उपयोगी होगा।

+0

एक चर कई बार घोषणा कोई त्रुटि नहीं है (अगर यह एक ही अनुवाद इकाई के भीतर नहीं है)। इसे परिभाषित करना है। –

+0

मुझे यह पकड़ा जाना चाहिए था, धन्यवाद। – egrunin

+1

हेडर गार्ड स्पष्टीकरण के लिए धन्यवाद। यहां एक अजीब बात है, हालांकि - अगर मुझे उस शीर्षलेख में परिभाषित फ़ंक्शन है तो मुझे केवल डुप्लिकेट प्रतीकों के लिए लिंकर त्रुटि मिलती है। मेरे वर्तमान मामले में मेरे पास स्थिरांक का एक समूह है और शीर्षलेख में नामस्थान में परिभाषित कुछ फ़ंक्शन हैं - मुझे केवल फ़ंक्शंस के लिए लिंकर त्रुटि मिलती है, कॉन्स ठीक है। ऐसा क्यों है? –

-9

कृपया, समस्या का एक सार्थक विवरण प्रदान करें। "मेरी फाइल" क्या है? आप किस "कॉन्स कैरेक्टर" ले रहे हैं?

जो आपने अभी तक प्रदान किया है, उसके लिए मैं केवल अनुमान लगा सकता हूं कि आपने xyz की शीर्ष परिभाषा को हेडर फ़ाइल में जोड़ा और फिर इसे कई अनुवाद इकाइयों में शामिल किया। नतीजा: ऑब्जेक्ट xyz एक से अधिक बार परिभाषित किया गया है। इसलिए त्रुटि।

7

समस्या प्रत्येक स्रोत फ़ाइल है जिसमें आपकी हेडर फ़ाइल शामिल है, इसकी बाहरी प्रतिलिपि के साथ xyz की अपनी प्रति प्राप्त होती है।

इसे ठीक करने का सबसे आसान तरीका xyz आंतरिक लिंकेज देना है। आप ऐसा कर सकते हैं अंतर्निहित चार के स्थिरांक होने के अलावा में सूचक ही स्थिरांक बनाकर:

const char* const xyz = "xyz"; 
+0

+1 यह obvusly सबसे अच्छा समाधान है। 'const' हमेशा अच्छा है। –

+3

कॉन्स निश्चित रूप से अच्छा है, लेकिन यह सिर्फ समस्या को छुपाता है कि अब प्रत्येक फ़ाइल से एक ही डेटा का एक उदाहरण है। –

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