मेरे पास निम्न चर से जुड़ाव के बारे में कुछ प्रश्न हैं।विभिन्न कॉन्स/स्थिर चर के लिंक
पहले
static
, तोextern
: सी ++ 03 के 7.1.1/7 के उदाहरण के द्वारा और compilers (Comeau, बजना और जीसीसी) के साथ प्रयोग कर, मैं निम्नलिखित लिंकेज प्रकार के लिए आया थाstatic int a; // (a) extern int a; // (b) valid, 'a' still internal
यह धारा 3.5 के अनुसार मुझे स्पष्ट है: (ए) आंतरिक संबंध का तात्पर्य है। और (बी) आंतरिक संबंध का भी तात्पर्य है, क्योंकि "ए" नाम स्थिर घोषित किया गया है (द्वारा (ए))।
पहले
extern
, तोstatic
extern int b; // (c) static int b; // (d) invalid!
सबसे पहले, (ग) बाहरी लिंकेज निकलता है। लेकिन (डी) आंतरिक संबंध का तात्पर्य है क्योंकि नाम "बी" को स्थिर (डी) द्वारा घोषित किया गया है। यह 7.1.1/7 के अनुसार अमान्य है, क्योंकि जुड़ाव जुड़ाव संगत नहीं है।
पहले
const
, तोextern
const double pi1 = 3.14; // (e) extern const double pi1; // (f) valid and 'pi1' is internal
सबसे पहले, (ई), आंतरिक संबंध का अर्थ है, क्योंकि यह स्थिरांक है, और न तो स्पष्ट निर्वासन और न ही पहले से गर्भित बाहरी लिंकेज की घोषणा की। और (एफ) बाहरी संबंध को इंगित करना चाहिए और एक त्रुटि होनी चाहिए, क्योंकि यह स्पष्ट रूप से नाम बाहरी घोषित करता है, लेकिन कंपाइलर्स इसे आंतरिक रखते हैं! ऐसा क्यों?यह मेरा सवाल है।
पहले
extern
, तोconst
extern const double pi2; // (g) const double pi2 = 3.14; // (h) valid and 'pi2' is external
अब, (छ) बाहरी लिंकेज क्योंकि हम स्पष्ट रूप से निर्वासन घोषित निकलता है। और (एच) बाहरी संबंध का भी अर्थ है क्योंकि (जी) स्पष्ट रूप से घोषित बाहरी।:
मैं प्रयोगात्मक बाहर लिंकेज 3 और 4 के लिए निम्नलिखित टेम्पलेट (दूसरा तर्क बाहरी लिंकेज के लिए आवश्यक है)
template<typename T, T&> struct ensure { };
ensure<const double, pi1> e1; // failed
ensure<const double, pi2> e2; // succeeded
सारांश के साथ मिल गया है Charles Bailey साथ चर्चा निकला काफी उपयोगी होने के लिए और पता चला 3.5/3
, जहां importa के दो संभव व्याख्याओं देखते हैं एनटी बुलेट प्वाइंट
नाम का नाम स्कोप (3.3।5) आंतरिक लिंकेज अगर यह
- एक वस्तु या संदर्भ है कि स्पष्ट रूप से स्थिरांक की घोषणा की और न स्पष्ट रूप से घोषित निर्वासन और न ही पहले से बाहरी लिंकेज के लिए घोषित किया जाता है का नाम है है;
अगर हम बात (f)
को देखो, तो दो व्याख्याओं अलग निष्कर्ष करने के लिए आते हैं, के रूप में नीचे
दिखाया पहली व्याख्या लिखते हैं कि
pi1
const
घोषित किया जाता है, लेकिन यह भीextern
घोषित किया जाता है। परिवर्तनीय इस प्रकार बाहरी लिंकेज है।दूसरी व्याख्या एक ही घोषणा के संदर्भ में "घोषित" के दोनों अवसरों की व्याख्या करती है। इस तरह, इसका मतलब है कि यह
const
घोषित किया गया है, लेकिनextern const
नहीं है। हम ध्यान देते हैं कि(e)
कोconst
औरextern const
घोषित नहीं किया गया है, इस प्रकार हमpi1
आंतरिक लिंकेज देते हैं।
अब कौन सी व्याख्या सही है? मैं उस शब्द से निर्धारित नहीं कर सकता, लेकिन संकलक इस दूसरे तरीके की व्याख्या करते हैं। विशेष रूप से, यदि हम पहली व्याख्या लेते हैं, तो 3.5/3
का अंतिम उद्धृत हिस्सा अनिवार्य होगा, क्योंकि कोई मान्य परिदृश्य नहीं होगा जिसमें नाम const
घोषित किया जाएगा और पहले बाहरी लिंक के साथ घोषित किया गया था लेकिन स्पष्ट extern
के बिना।
शायद मुझे कुछ याद आ रहा है, लेकिन 3 1 जैसा नहीं है? (यानी, 'pi1' नाम' स्थिर घोषित 'है?)। हालांकि मुझे लगता है कि मैंने सिर्फ सवाल पूछेगा कि क्यों 4 अमान्य नहीं है। – GManNickG
@GMan, इन दो मामलों के लिए 3.5/3 देखें। वे विभिन्न बुलेट बिंदुओं से संभाले जाते हैं। –
@GMan 4 के लिए, पहले इसे बाहरी बना दिया गया और दूसरा इसे आंतरिक नहीं बनाता है, क्योंकि नाम स्पष्ट रूप से बाहरी घोषित किया गया था (पहली घोषणा द्वारा)। तो दोनों केवल पहले, साथ ही पहले और दूसरे दोनों एक ही लिंक को दर्शाते हैं। 2 के लिए, केवल पहले बाहरी संबंध का तात्पर्य है, लेकिन पहले और दूसरे एक साथ आंतरिक संबंध को इंगित करते हैं क्योंकि नाम स्पष्ट रूप से दूसरे द्वारा स्थिर घोषित किया जाता है। इस प्रकार यह अमान्य है। –