वैश्विक std :: स्ट्रिंग और एक परिभाषा नियम

मेरे पास एक हेडर फ़ाइल है जिसमें निम्न परिभाषा है

const std::string error[] = {"a", "b"};

अब मैं इस फाइल को दो अलग-अलग अनुवाद इकाइयों में शामिल कर रहा हूं और स्रोत कोड संकलित कर रहा हूं। सब कुछ काम करता है, लेकिन क्यों? यह एक परिभाषा नियम को तोड़ने की उम्मीद है।

अब और भी दिलचस्प, मैं प्रकार बदल रहा हूँ

const char* error[] = {"a", "b"};

और यहां यह अपेक्षित त्रुटि है

multiple definition of `error'

यह int , char , छोटा और अन्य अभिन्न प्रकारों के लिए std :: string के समान कार्य करता है। यह क्या है?

0

3 उत्तर

const gives namespace-scoped variables internal linkage, that's why it works, effectively the same as

static const std::string error[] = {"a", "b"};

दूसरा काम नहीं करता है क्योंकि यह स्थिरता नहीं है जो कि है, लेकिन char में यह शामिल है।

0
जोड़ा
यह भी ध्यान रखें कि यह उन कुछ स्थानों में से एक है जहां सी ++ सी के साथ संगतता तोड़ता है यह प्रश्न
जोड़ा लेखक ComicSansMS, स्रोत
पता नहीं था कि कॉन्स एक आंतरिक जुड़ाव देता है। धन्यवाद। क्या यह मानक में उल्लेख किया गया है?
जोड़ा लेखक axe, स्रोत
हाँ, इसे मिला। ऑब्जेक्ट्स घोषित घोषित और स्पष्ट रूप से घोषित बाहरी में आंतरिक संबंध नहीं है।
जोड़ा लेखक axe, स्रोत
@axe संदर्भ क्या है?
जोड़ा लेखक BoBTFish, स्रोत
कोई बात नहीं। यह 7.1.1 स्टोरेज क्लास विनिर्देशक [dcl.stc], अनुच्छेद 7 है।
जोड़ा लेखक BoBTFish, स्रोत

वैश्विक चर घोषित const में आंतरिक संबंध है, जैसे कि उन्हें static भी घोषित किया गया था। आप अलग-अलग अनुवाद इकाइयों में एक ही नाम के साथ आंतरिक चर परिभाषित कर सकते हैं, इसलिए आपके पहले उदाहरण में क्या होता है - प्रत्येक इकाई जिसमें हेडर शामिल है, उसकी सरणी की प्रति प्राप्त होती है।

दूसरा उदाहरण const नहीं है - पॉइंटर्स निरंतर ऑब्जेक्ट्स को इंगित करते हैं, लेकिन स्वयं विचलित होते हैं। तो इस सरणी में बाहरी संबंध है, और यह एक परिभाषा नियम के अधीन है।

0
जोड़ा

From MSDN

सी में, निरंतर मान बाहरी लिंकेज के लिए डिफ़ॉल्ट हैं, इसलिए वे केवल स्रोत फ़ाइलों में दिखाई दे सकते हैं। सी ++ में, निरंतर मान आंतरिक लिंकेज के लिए डिफ़ॉल्ट होते हैं, जो उन्हें शीर्षलेख फ़ाइलों में दिखाई देने की अनुमति देता है।

0
जोड़ा