c++ - मुड़ तर्क: एक फ़ाइल में एक वैश्विक चर एक extern चर को संदर्भित करता है, लेकिन उस extern चर द्वारा भी कहा जाता है



compilation linker (1)

fileA.cpp:

#include <iostream>
extern int iA;
extern int iB= iA;
int main()
{
std::cout<<iA<<','<<iB;
}

fileB.cpp

extern int iB;
extern int iA = 2*iB;

संकलित और जुड़ा हुआ और भाग गया, डिबग और रिलीज़ मोड में आना 0,0 मेरा प्रश्न यह है कि यह कैसे काम करता है, मंच को जोड़ने में कोई समस्या क्यों नहीं है? मैं वीसी ++ 2003 का उपयोग कर रहा हूं


प्रारंभकर्ता extern कीवर्ड को ओवरराइड करता है, इसलिए इसके बारे में "जादुई" कुछ नहीं है: आप बस विभिन्न फ़ंक्शंस में दो पूरी तरह से असंबंधित चर को घोषित और परिभाषित कर रहे हैं।

[C++14: 3.1/2]: एक घोषणा एक परिभाषा है, जब तक कि यह फ़ंक्शन के शरीर (8.4) को निर्दिष्ट किए बिना फ़ंक्शन घोषित करता है, इसमें extern स्पेसिफायर (7.1.1) या लिंक-विनिर्देश 25 (7.5) और न तो प्रारंभकर्ता और ही फ़ंक्शन-बॉडी , यह क्लास की परिभाषा (9.2, 9.4) में एक स्थिर डेटा सदस्य की घोषणा करता है, यह एक वर्ग का नाम घोषणा (9.1) है, यह एक अपारदर्शी- enum-declaration (7.2) है, यह एक टेम्पलेट-पैरामीटर (14.1), यह फ़ंक्शन घोषणापत्र में एक पैरामीटर-घोषणा (8.3.5) है, जो फ़ंक्शन-परिभाषा के घोषणापत्रक नहीं है, या यह एक typedef घोषणा (7.1.3) है, एक उपनाम-घोषणा ( 7.1.3), एक घोषणा-घोषणा (7.3.3), एक स्टेटिक_एस्टर्ट-घोषणा (खंड 7), एक विशेषता-घोषणा (खंड 7), एक खाली-घोषणा (खंड 7), या उपयोग-निर्देश (7.3। 4)।

आपका प्रोग्राम निम्न के बराबर है:

fileA.cpp

#include <iostream>
extern int iA;
int iB= iA;
int main()
{
std::cout<<iA<<','<<iB;
}

fileB.cpp

extern int iB;
int iA = 2*iB;

अब, कुछ भी हो जाने से पहले दोनों ऑब्जेक्ट्स को स्थैतिक आरंभीकरण (बिटवायर सर्व-शून्य) से गुजरना पड़ता है। जब गतिशील-आरंभिकता बाद में होती है, इस पर निर्भर करता है कि क्या fileA.cpp या fileB.cpp में स्थैतिक-स्टोरेज-अवधि वाले ऑब्जेक्ट्स को पहले आरम्भिक रूप दिया जाता है (और आप नहीं जानते कि यह ऑर्डर क्या होगा) या तो iB शून्य पर आरंभीकृत है iA (तब iA को अपेक्षित रूप से 2*iB लिए आरम्भ किया जाता है) या iA को दो गुणा करके शून्य iB लिए आरंभीकृत किया जाता है, जो अभी भी दो है (फिर iB शून्य iA आरंभ किया जाता है)।

किसी भी तरह से, दोनों वस्तुओं को समाप्त करने जा रहे हैं, अच्छी तरह से परिभाषित शब्दों के माध्यम से, शून्य के मूल्य वाले।





external