static
नाम स्थान दायरे में एक मिथ्या नाम है, और उपयोग नहीं किया जाना चाहिए। यह का अर्थ है कि इकाई घोषित स्थिर है आंतरिक नाम बाध्यकारी है; दूसरे शब्दों में, कि अन्य अनुवाद इकाइयों में एक ही नाम को एक अलग इकाई में संदर्भित करेगा, और परिवर्तनीय परिभाषाओं के मामले में, प्रत्येक अनुवाद इकाई में चर का एक अलग उदाहरण होगा। इसका जीवनकाल पर कोई असर नहीं पड़ता है। (सभी चर घोषित या नाम स्थान दायरे में परिभाषित स्थिर रहते हैं।)
static
नाम स्थान दायरे में भी मान्य नहीं है। इसका इस्तेमाल न करें।
शीर्षलेख में एक चर घोषित करने के संबंध में: इसे extern
, और static
के साथ उपसर्ग करें। यदि एक चर को extern
घोषित किया गया है, और कोई प्रारंभिकता नहीं है, तो घोषणा एक परिभाषा नहीं है। पाठ्यक्रम में, इस मामले में, आपको कहीं परिभाषा प्रदान करनी होगी ( एकल स्रोत फ़ाइल में)।
extern int testNum = 5;
int testNum = 5;
int testNum; // implicitly initialized with 0.
संपादित करें:
कुछ हद तक स्पष्ट करने के लिए: कुछ भ्रम जीवन और नाम बंधन के बीच यहां है: की तर्ज पर कुछ
- एक वस्तु एक जीवन भर है (ऑटो, स्थिर या गतिशील — या अस्थायी, या अपवाद), और
- एक नाम किसी इकाई के लिए बाध्य है; यदि नाम एक चर होने के लिए घोषित किया गया है, तो इकाई एक वस्तु है।
नहीं स्थिर जीवन के साथ कीवर्ड static
भ्रमित मत करो। (कार्य static
हो सकता है, लेकिन कार्यों C++ कोई परिभाषित जीवन है, वे सिर्फ वहाँ रहे हैं।)
इन नियमों के बारे में बहुत orthognal नहीं हैं।मूल रूप से, के साथ जीवन भर के लिए संबंध है:
- सभी चर नाम स्थान गुंजाइश पर घोषित कर दिया है स्थिर जीवन, हमेशा की तरह,
- चर स्थानीय गुंजाइश पर घोषित कर दिया ऑटो जीवन जब तक वे
static
घोषित किया गया है, और
- चर है कक्षा के दायरे में घोषित कक्षा वर्ग का जीवनकाल होता है जिसमें उन्हें शामिल किया जाता है, जब तक उन्हें
static
घोषित नहीं किया जाता है। जीवन भर के संबंध में। स्थिर जीवन भर साथ
वस्तुओं main
से पहले कुछ समय अस्तित्व में आया, और जब तक आप main
से लौटने रहते हैं।
साथ बाध्यकारी नाम के संबंध
:
- चर नाम स्थान गुंजाइश पर घोषित कर दिया बाहरी नाम बाध्यकारी, जब तक कि वे
static
घोषित किया गया है, जो मामले में वे आंतरिक नाम बाध्यकारी है (लेकिन static
के इस प्रयोग को पदावनत किया गया है), या वे const
, कर रहे हैं और extern
घोषित नहीं कर रहे हैं,
- चर वर्ग गुंजाइश पर घोषित कर दिया, बाहरी नाम बाध्यकारी है, भले ही वे
static
घोषित किया गया है, और अगर
- ब्लॉक स्कोप पर घोषित चर कोई बाध्यकारी नहीं है।
अंत में, यह घोषणा है कि घोषणा एक परिभाषा है या नहीं। यदि यह एक परिभाषा है, तो स्मृति आवंटित की जाती है और ऑब्जेक्ट (या हो सकता है) प्रारंभ किया गया है। यदि यह परिभाषा नहीं है, तो यह केवल कंपाइलर को बताता है कि घोषणा में घोषित इकाई (ऑब्जेक्ट) के लिए कहीं और परिभाषा है। आम तौर पर, एक चर घोषणा एक परिभाषा है जब तक इसे extern
घोषित किया गया है और में प्रारंभकर्ता नहीं है।
क्या आप जानते हैं कि '# शामिल' कैसे काम करता है? यह निर्दिष्ट फ़ाइल की सामग्री को कॉपी-पेस्ट करता है। और 'setNum' परिभाषा वास्तव में' main.cpp' में भी है? – Xeo
मैंने इसे नहीं दिखाया, लेकिन मेरे पास मानक। IfndEF DEF है। इसके अलावा, चूंकि मैं इसे केवल एक बार * पूरे कार्यक्रम में शामिल करता हूं, फिर भी यह कोई समस्या नहीं होगी? – dsollen
क्या आप 'नेमस्पेस टेस्ट' का उपयोग करते हैं? –