2012-08-15 10 views
11

स्थैतिक कीवर्ड उस अनुवाद इकाई तक सीमित वैश्विक चर का दायरा रखता है। यदि मैं .h फ़ाइल में static int x का उपयोग करता हूं और उस .h फ़ाइल को अन्य सभी फ़ाइल शामिल करता हूं, तो क्या वे सभी एक ही अनुवाद इकाई से संबंधित नहीं होंगे? फिर, एक्स हर जगह दिखाई नहीं देगा? तो अब स्थिर की भूमिका क्या है?सी ++ - .h फ़ाइल में स्थैतिक वैश्विक चर घोषित करने के लिए ठीक है?

इसके अलावा, static const int x का कोई उपयोग है, जहां x एक वैश्विक चर है? डिफ़ॉल्ट रूप से सभी वैश्विक वैरिएबल स्थिर नहीं हैं? और यह एक कॉन्स वैरिएबल का दायरा टीयू तक सीमित है भले ही यह फ़ाइल में लूप में ही सीमित है?

+4

मुझे लगता है कि हेडर में स्टेटिक्स का सबसे आम उपयोग बग पेश करना है, या डिबगिंग कठिन बनाना है। – PlasmaHH

उत्तर

31

यदि आप लिखना

static const int x 

एक फ़ाइल तो में हर अनुवाद इकाई है कि # शामिल -s इस अपने स्वयं के निजी चर x होगा।

आप करना चाहते हैं 1 वैश्विक चर हर किसी को दिखाई आप

extern const int x; 
फ़ाइल में

और

const int x = ...; 

सीपीपी फ़ाइलों में से एक में लिखना चाहिए।

यदि आप केवल एक अनुवाद इकाई के लिए स्थिर स्थिरांक दिखाना चाहते हैं - में इसका उल्लेख न करें .h फ़ाइलें बिल्कुल भी नहीं।

3

आप अंत में उस चर के उस चर की निजी प्रतियां समाप्त कर देंगे, जिसके परिणामस्वरूप आप इसे वहां डाल देंगे। यह जगह पर यादृच्छिक प्रतियों को रखने का कोई मतलब नहीं होगा। नहीं, यह ठीक नहीं है।

आप namespace ब्लॉक में const int घोषित कर सकते हैं; ठीक है।

0

असल में, प्रत्येक स्रोत फ़ाइल सभी शामिल हेडर फ़ाइलों के साथ एक एकल अनुवाद इकाई है। तो यदि आपके पास हेडर फ़ाइल में स्थिर चर है तो यह प्रत्येक स्रोत फ़ाइल (अनुवाद इकाई) में अद्वितीय होगा।

6

यदि मैं .h फ़ाइल में स्थिर int x का उपयोग करता हूं और शामिल करता हूं वह .h प्रत्येक अन्य फ़ाइल फ़ाइल करता है, क्या वे सभी एक ही अनुवाद इकाई से संबंधित नहीं होंगे?

यदि आप स्थिर के रूप में कुछ घोषित करते हैं (कक्षा के अंदर नहीं, वर्ग स्थिर कीवर्ड के लिए एक अलग अर्थपूर्ण है), तो स्थिर चर को इसके टीयू के बाहर नहीं देखा जा सकता है। तो इसे हेडर फ़ाइल में डालने से प्रत्येक टीयू का कारण उस हेडर समेत उस स्थैतिक चर की एक अलग निजी प्रति हो।

और यह एक कॉन्स्ट चर का दायरा टीयू तक सीमित है भले ही यह फ़ाइल में लूप में सीमित है?

नहीं। स्थिर स्थिर मूल्य के लिए भी, दायरे इसकी घोषणा द्वारा निर्धारित किया जाता है। तो स्कोप आपके ब्रैकेट के लिए सीमित होगा।

1

const योग्यता वाले चर के लिए अवलोकन अंतर यह है कि static संस्करण में आपको एक प्रति यूनिट प्रति प्रति यूनिट मिलेगी और इसलिए दो ऐसी प्रतियों की पता लगाना विफल हो सकता है।

यदि आप कभी भी अपने const वैरिएबल के पते का उपयोग नहीं करते हैं तो कोई भी आधुनिक कंपाइलर केवल मान का उपयोग करने और चर को स्वयं अनुकूलित करने में सक्षम होना चाहिए। ऐसे मामले में staticconst -क्वॉलीफाइड वैरिएबल पूरी तरह से ठीक है।

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