2016-06-03 7 views
7

जब मैं अपने वर्ग कार्यान्वयन में से एक के साथ मौजूदा सीपीपी में इस कोड को जोड़नाकोई वैश्विक चर प्रारंभ

#include <iostream> 

struct TestStruct{ 
    TestStruct(int i) 
    { 
     std::cerr << i << std::endl; 
     x = i; 
    } 
    int x; 
}; 

TestStruct t(8); 

यह 8 main निष्पादित से पहले प्रिंट करता है।

लेकिन जब मैंने नई खाली फ़ाइल test.cpp बनाई और उसी कोड को इसमें रखा, तो कुछ भी मुद्रित नहीं किया गया था। मैंने जांच की कि यह सीपीपी संकलित और जुड़ा हुआ था। स्थिर सीबी के रूप में संकलित सभी सीपीपी फाइलें और फिर इस lib को main.o निष्पादन योग्य फ़ाइल में लिंक किया गया है। मैं g ++ 5.3 का उपयोग करता हूं केवल विकल्प -std=C++14 है।

दूसरे मामले में वैश्विक चर प्रारंभिकरण क्यों याद किया जाता है?

+0

कृपया अपनी टाइपिंग गलतियों को ठीक करें और आपके मामले 1 और केस 2 के बीच क्या अंतर है? –

+0

अन्य बड़े कोड के साथ सीपीपी में पहला मामला और नई फ़ाइल –

उत्तर

8

आपने TestStruct कक्षा को स्थिर पुस्तकालय में एक अलग मॉड्यूल के रूप में जोड़ा, और इसे आपके निष्पादन योग्य से जोड़ा।

एक स्थिर पुस्तकालय का उपयोग करने का पूरा उद्देश्य यह है कि केवल मॉड्यूल जिनके पास कोई भी प्रतीक, कक्षाएं या अन्य संसाधन हैं जिन्हें आप निष्पादन योग्य द्वारा संदर्भित कर रहे हैं - वे निष्पादन योग्य में जुड़े हुए हैं। एक स्थिर पुस्तकालय में मॉड्यूल जिनके पास मुख्य निष्पादन योग्य द्वारा प्रत्यक्ष या अप्रत्यक्ष रूप से संदर्भित कोई भी प्रतीक नहीं है, मुख्य निष्पादन योग्य में शामिल नहीं होते हैं। यही एक स्थिर पुस्तकालय है।

क्योंकि आपके निष्पादन योग्य के पास TestStruct वर्ग का कोई स्पष्ट संदर्भ नहीं था, तो मॉड्यूल आपके निष्पादन योग्य में लिंक नहीं हुआ था, और अंतिम निष्पादन योग्य का हिस्सा नहीं बन गया था।

लेकिन जब आपने मौजूदा मॉड्यूल में TestStruct कक्षा को जोड़ा, तो आपके निष्पादन योग्य पहले से ही संदर्भित करता है और उपयोग करता है (या तो प्रत्यक्ष या परोक्ष रूप से), तो यह कक्षा, अन्य मॉड्यूल से अन्य सभी प्रतीकों और कक्षाओं के साथ, आपके निष्पादन योग्य में लिंक हो जाती है और अंतिम निष्पादन योग्य का हिस्सा बन गया।

क्योंकि आपका निष्पादन योग्य उस अन्य मॉड्यूल में कुछ प्रतीक या अन्य संसाधनों का संदर्भ देता है, परीक्षण कक्षा समेत उस मॉड्यूल में सब कुछ निष्पादन योग्य में जुड़ा हुआ है।

+0

कक्षाओं में दूसरा मामला ऑब्जेक्ट फ़ाइलों में मौजूद नहीं है। "वर्ग" टेस्टस्ट्रक्चर के बारे में यह उत्तर क्या कहता है वास्तव में परिवर्तनीय 'टी' पर लागू होता है, है ना? – Angew

+0

वह, और वर्ग का कन्स्ट्रक्टर। –

+0

निश्चित रूप से, लेकिन निर्माता की मौजूदगी वास्तव में प्रश्न का विषय नहीं है, मैं कहेंगे। 'टी' बनाते समय यह कॉल है। – Angew

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