2013-02-20 21 views
10

मैं तो इस तरह की स्ट्रिंग एक API में लगातार प्रदान करना चाहते हैं:निर्वासन स्थिरांक चार * स्थिरांक SOME_CONSTANT मुझे दे लिंकर त्रुटियों

extern const char* const SOME_CONSTANT; 

लेकिन अगर मैं

const char* const SOME_CONSTANT = "test"; 
के रूप में मेरे स्थिर पुस्तकालय स्रोत फ़ाइल में परिभाषित

त्रुटि 1 LNK2001 त्रुटि:

मैं जब कि पुस्तकालय से लिंक हो और SOME_CONSTANT का उपयोग कर लिंकर त्रुटियों हो रही अनसुलझे बाह्य प्रतीक " चार स्थिरांक * स्थिरांक SOME_CONSTANT "(? SOME_CONSTANT @@ 3QBDB)

दोनों extern const char* const घोषणा और परिभाषा यह काम करता है से सूचक स्थिरांक सत्ता (दूसरा स्थिरांक कीवर्ड) निकाल रहा है। मैं इसे पॉइंटर कॉन्स्ट-नेस के साथ कैसे निर्यात कर सकता हूं?

+0

अच्छी तरह से दिखाई नहीं दे रहा है, ऐसा लगता है कि यह ठीक होना चाहिए http://stackoverflow.com/questions/2190919/mixing-extern-and-const –

+0

देखकर आपने इसे सी ++ टैग किया है, क्या "स्ट्रिंग स्थिर" वास्तव में पहले स्थान पर 'const std :: string' नहीं होना चाहिए? – Angew

+0

इसके अलावा, निरंतर परिभाषित स्रोत फ़ाइल में दिखाई देने वाली 'बाहरी' घोषणा है? – Angew

उत्तर

11

समस्या यह हो सकती है कि extern निरंतर परिभाषित स्रोत फ़ाइल में घोषणा दिखाई नहीं दे रही है। परिभाषा ऊपर घोषणा दोहरा, इस तरह का प्रयास करें:

extern const char* const SOME_CONSTANT; //make sure name has external linkage 
const char* const SOME_CONSTANT = "test"; //define the constant 
+0

यह काम करता है। मैं बस सोच रहा था कि लिंकर जानता है कि यह मेरे प्रतीक को क्यों नहीं रोकना चाहिए ... और फिर मैंने आपका जवाब देखा और चेहरे का सामना किया: डी निश्चित रूप से मुझे बाहरी संबंध लागू करना है। – AndiDog

+3

@AndiDog ध्यान दें कि यह परिभाषा में 'बाहरी' जोड़ने जैसा ही है। जैसा कि अन्य उत्तर से पता चलता है, सी ++ में 'const'' का अर्थ 'स्थिर 'है। तो आपको इसकी प्रतिक्रिया करने और स्पष्ट रूप से अपनी परिभाषा में 'बाहरी' कहने की आवश्यकता है। –

+1

सी ++ में "कॉन्स्ट' 'का अर्थ है' स्थैतिक '... यह सी ++ विनिर्देश में मनमाने ढंग से हैक की तरह लगता है। आलसी लोगों के लिए माइक्रो अनुकूलन !!! – FooF

9

सबसे शायद आप अपने कार्यान्वयन फ़ाइल में अपने शीर्ष लेख शामिल करना भूल

वैसे भी, एक extern बिना परिभाषा

के लिए कीवर्ड extern जोड़ने घोषणा में आंतरिक संबंध है और इस प्रकार लिंकर

+0

यह सच लगता है (लिनक्स में हाल ही में 'जीसीसी' के साथ परीक्षण किया गया है), आपके लिए +1। ऐसा क्यों है? यहाँ तर्कसंगत क्या है? यह सुनिश्चित करने के लिए कि हेडर फ़ाइल घोषणा और परिभाषा मैच? इस परेशान व्यवहार के लिए स्पष्टीकरण के लिए कोई लिंक? – FooF

+0

तर्क दोबारा, गैर-'मानक' स्थिरांकों में सी ++ में आंतरिक संबंध क्यों है, मुझे लगता है कि इसे आवश्यक नाम टकराव से बचने और लिंकिंग के लिए एक परिभाषा नियम संघर्ष से बचने के लिए करना है। सी 99 में एक सुविधा है जो * की तरह * है लेकिन बिल्कुल वही नियम नहीं है (मुझे विवरणों के बारे में निश्चित नहीं है)। अनिवार्य रूप से इसका मतलब है कि आप अधिक आसानी से घोषणा कर सकते हैं * और हेडर फ़ाइलों में * स्थिरांक परिभाषित कर सकते हैं। आप अपनी निरंतर परिभाषा को हेडर फ़ाइल में ले जाने पर विचार कर सकते हैं, और फिर 'बाहरी' को छोड़ दें। फिर आप अच्छे उपाय के लिए 'स्थिर' जोड़ सकते हैं, लेकिन इसकी आवश्यकता नहीं है: यही वह सब कुछ है। –

+0

जैसा कि आप उल्लेख करते हैं, हेडर फ़ाइल में 'स्थिर कॉन्स char * const SOME_CONSTANT =" test "को परिभाषित करने की हमेशा अच्छी तरह से ज्ञात संभावना होती है। या हम हेडर में अनाम नाम स्थान में परिभाषा डाल सकते हैं ... यह अभी भी मुझे एक बेवकूफ हैक की तरह लगता है जो भाषा परिभाषा के लिए आवश्यक जटिलता को जोड़ता है !!! हो सकता है कि इसे हेडर फ़ाइलों के लिए अधिक पठनीय माना जा सके जिसे 'स्थिर' या अज्ञात नेमस्पेस गले लगाए जाने के साथ नहीं जोड़ा गया है। – FooF

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