foo
पहले प्रिंट किया जाएगा, के रूप में वस्तुओं को उनकी घोषणाओं के क्रम में शुरू किया जाता है। चलाने के लिए और देखें:
वैसे, __attribute__((constructor))
स्टैंडर्ड सी नहीं है ++। यह जीसीसी का विस्तार है। तो आपके कार्यक्रम का व्यवहार इस बात पर निर्भर करता है कि जीसीसी ने इसे कैसे परिभाषित किया है। संक्षेप में, यह कार्यान्वयन-परिभाषित है, इसके अनुसार foo
पहले मुद्रित है।
doc कहते हैं, इससे पहले कि निष्पादन मुख्य प्रवेश करती है
निर्माता विशेषता समारोह स्वचालित रूप से कहा जा करने का कारण बनता()। इसी तरह, विनाशक विशेषता मुख्य() पूरा होने या बाहर निकलने के बाद स्वचालित रूप से फ़ंक्शन को कॉल करने का कारण बनती है() को कॉल किया गया है। इन विशेषताओं के साथ कार्य डेटा प्रारंभ करने के लिए उपयोगी हैं जो प्रोग्राम के निष्पादन के दौरान पूरी तरह से उपयोग किए जाएंगे।
आप ऑर्डर को नियंत्रित करने के लिए वैकल्पिक पूर्णांक प्राथमिकता प्रदान कर सकते हैं जिसमें निर्माता और विनाशक कार्य चल रहे हैं। एक बड़ी प्राथमिकता संख्या वाला एक कन्स्ट्रक्टर एक बड़ी प्राथमिकता संख्या वाले निर्माता के समक्ष चलता है; विपरीत संबंध विनाशकों के लिए है। इसलिए, यदि आपके पास एक ऐसा निर्माता है जो संसाधन और विनाशक को आवंटित करता है जो समान संसाधन को हटा देता है, तो दोनों कार्यों में आम तौर पर समान प्राथमिकता होती है। कन्स्ट्रक्टर और विनाशक कार्यों के लिए प्राथमिकताएं नामस्थान-स्कोप सी ++ ऑब्जेक्ट्स (सी ++ विशेषताएँ देखें) के लिए निर्दिष्ट हैं।
मैं बोल्ड में टेक्स्ट दर्शाता है लगता है, वस्तुओं, उनकी घोषणाओं के क्रम में प्रारंभ कर रहे हैं के रूप में मैं पहले भी कहा है, जो काफी भी online demo पुष्टि की है।
मुझे लगता है कि आप भी इस पढ़ने के लिए करना चाहते हैं:
आप नियंत्रित/आरंभीकरण आदेश को बदलने के लिए चाहते हैं, आप init_priority
विशेषता का उपयोग कर सकते हैं, प्राथमिकता प्रदान करते हैं। the page से लिया:
Some_Class A __attribute__ ((init_priority (2000)));
Some_Class B __attribute__ ((init_priority (543)));
यहाँ, B
A
से पहले आरंभ नहीं हो जाता।
आप इस तरह के कंपाइलर सुविधाओं का उपयोग कहां करते हैं ?? – AlexTheo
@AlexTheo: यह काफी आम है। उदाहरण देखें। जब भी आप कुछ प्रारंभ करना चाहते हैं तो आप आमतौर पर इसका इस्तेमाल करते हैं। –
Albert
असल में मैं स्थिर कॉन्स बूल _isInitialized जैसे कुछ पसंद करता हूं और एक निजी प्रारंभिक कार्य करता हूं जिसके साथ मैं अपनी ऑब्जेक्ट को कॉन्स्ट बूल MyClass :: _ isInitialized = initFunction(); लेकिन ये केवल उन वस्तुओं के लिए है जिन्हें मैं सबसे पहले शुरू करना चाहता हूं। अन्यथा कन्स्ट्रक्टर को नौकरी करना चाहिए। – AlexTheo