मैं हाल ही में सी ++ की समीक्षा कर रहा हूं। यहाँ मेरा प्रश्न है। file1.cpp और file2.cpp में कोड देखें।

File1.cpp

int x1 = 1;
int y1 = x1 + 2;

File2.cpp

#include "necessary_headers"
extern int y1;
int y2 = y1 + 2;
int main()
{
    cout << "y2 is "<<y2<<endl;
    return 0;
}

मैं अलग क्रम में संकलित करता हूं:

gcc file1.cpp file2.cpp

आउटपुट निश्चित रूप से y2 is 5 है।

gcc file2.cpp file1.cpp 

आउटपुट y2 is 2 है। (मेरा सवाल इस बारे में है)

मैं यह भी कोशिश करता हूं: gcc file2.cpp। और यह निश्चित रूप से undefined reference to y1 देता है।

मेरा प्रश्न यह है कि, लिंकिंग अनुक्रम "गलत" होने पर भी undefined reference to y1 त्रुटि देने के बजाय gcc file2.cpp file1.cpp संकलन क्यों करेगा? क्या इसलिए कि file2.cpp को लिंक करते समय, लिंकर y1 को संदर्भित करने के लिए स्मार्ट है, जिसे निम्न फ़ाइल file1.cpp में परिभाषित किया गया है? और इस तरह, y1 को file1.cpp में परिभाषा का उपयोग करने के बजाय file2.cpp में 0 (डिफ़ॉल्ट मान) से प्रारंभ किया जाता है? तो इस तरह, file1.cpp "int y1 = x1 + 2" में परिभाषा और आरंभीकरण लिंकिंग अनुक्रम द्वारा अमान्य नहीं है? यदि नहीं, तो मैं उस कथन को y1 = x1 + 2 असाइन करने के लिए कैसे निष्पादित कर सकता हूं? अंत में, क्या यह एक सामान्य संकलक व्यवहार है? सी ++ मानक के अनुसार, विभिन्न अनुवाद इकाइयों में वैश्विक चर प्रारंभ करने का क्रम अपरिभाषित है।

आपकी सहायताके लिए धन्यवाद! मैं इसकी प्रशंसा करता हूँ।

1
Han XIAO 25 अप्रैल 2018, 06:50

1 उत्तर

सबसे बढ़िया उत्तर

मेरा प्रश्न यह है कि, y1 त्रुटि के लिए अपरिभाषित संदर्भ देने के बजाय gcc file2.cpp file1.cpp संकलित क्यों होगा, भले ही लिंकिंग अनुक्रम "गलत" हो?

basic.link#2.1 से

जब किसी नाम में बाहरी लिंकेज होता है, तो वह जिस इकाई को दर्शाता है वह हो सकता है अन्य अनुवाद इकाइयों के दायरे से नामों द्वारा संदर्भित या from एक ही अनुवाद इकाई के अन्य क्षेत्र।

इस प्रकार, यदि आप फ़ाइल को संकलित करते हैं तो extern int y1; अपरिभाषित नहीं है (उदा. file1.cpp) जिसमें y1 की परिभाषा है।

लिंकिंग के दौरान, अन्य अनुवाद इकाइयों से y1 की परिभाषा की जाँच की जाती है।

1
Joseph D. 25 अप्रैल 2018, 07:20