2013-08-03 24 views
10

Manyotherquestions एक हेडर फ़ाइल में इसे घोषित करके और एक .cpp फ़ाइल में इसे परिभाषित करके आवंटित करने के तरीके के साथ सौदा करें।सी ++ हेडर में स्थिर चर घोषित और परिभाषित करें?

मैं जो करना चाहता हूं वह मेरी कक्षा के लिए किसी भी .cpp फ़ाइलों का उपयोग नहीं करना है, और सभी कार्यों को इनलाइन (हेडर फ़ाइल में) के रूप में परिभाषित करना है। जिस समस्या में मैं चलाता हूं वह स्थिर सदस्य चर को परिभाषित करने का तरीका है ताकि जब भी .h फ़ाइल को कई संकलन इकाइयों में शामिल किया गया हो, मुझे "पहले परिभाषित" लिंकर त्रुटि नहीं मिलती है।

यदि यह काम पूरा हो जाता है तो मैं प्रीप्रोसेसर हैक्स इत्यादि के लिए खुला हूं। मैं बस किसी भी .cpp फ़ाइलों से बचना चाहता हूँ।

यदि यह महत्वपूर्ण है कि मैं जीसीसी का उपयोग कर रहा हूं।

+0

आप बस अपने चर को 'स्थिर 'घोषित करते हैं। वेरिएबल का एक नया उदाहरण प्रत्येक अनुवाद इकाई में बनाया जाएगा जिसमें आप हेडर फ़ाइल शामिल करते हैं, लेकिन लिंक समय पर, कोई विवाद नहीं होगा क्योंकि ऑब्जेक्ट्स में स्थिर लिंक है ... –

+0

नहीं, स्थिर डेटा सदस्यों के पास बाहरी संबंध है। – jrok

+0

"इसे परिभाषित करना (आवंटित करना)": ** परिभाषित ** और ** आवंटित ** दो अलग-अलग चीजें हैं। –

उत्तर

13

आप सिंगलटन पैटर्न का दुरुपयोग करता है, तो आप वास्तव में किसी भी सीपीपी से बचना चाहिए कर सकते हैं फाइलें:

class Foo { 
    public: 
     static Bar& getMyStatic() { 
      static Bar bar; 
      return bar; 
     }; 
}; 

यह काम करता है, क्योंकि अब चर एक समारोह के अंदर एक स्थिर चर रहा है, औरकक्षा संदर्भ के भीतरका फ़ंक्शन संदर्भ में एक अलग अर्थ है। और कार्यों के लिए, लिंकर कई समान परिभाषाओं को पहचानता है और प्रतियों को फेंकता है।

लेकिन, ज़ाहिर है, मैं दृढ़ता से .cpp फ़ाइलों से बचने के खिलाफ सलाह दूंगा: इसका मतलब है कि आप एक ऐसी स्थिति में आते हैं जहां आपको पूरे कार्यक्रम, या कम से कम बड़े हिस्से को एक बड़े टुकड़े में बनाना है। आपके द्वारा किए गए प्रत्येक परिवर्तन को एक पूर्ण पुनर्निर्माण की आवश्यकता होगी जो आपके परिवर्तन-संकलन-परीक्षण चक्र को काफी धीमा कर दे। बहुत छोटी परियोजनाओं के लिए जो समस्या नहीं हो सकती है, लेकिन यह मध्यम से बड़े लोगों के लिए है।

+0

यह एक .cpp फ़ाइल में स्थैतिक चर डालने से बचने के लिए सबसे अच्छा (और केवल) तरीका प्रतीत होता है। संकलन समय के लिए: मेरा संकलित कोड 32 केबी तक सीमित है, जिससे यह ऊपरी बाध्यता रखता है कि यह कितना समय लगेगा। – srlm

-1

जब तक आप केवल अपनी पूरी परियोजना में उस हेडर फ़ाइल को शामिल करते हैं, तो आप ठीक रहेगा। हालांकि, यह एक बहुत मजबूत आवश्यकता है, और दूसरों को पालन करना मुश्किल हो सकता है।

आपके पास static वैरिएबल हो सकता है, लेकिन इसका मतलब है कि आपके पास पूरे कार्यक्रम के लिए एक से अधिक हैं, जो इससे कोई फर्क नहीं पड़ता है (ध्यान रखें कि आप इसे भविष्य में नहीं बदल सकते हैं, इसलिए आपके पास क्या हो सकता है "लेटेंट बग" के रूप में जाना जाता है - आप कुछ अन्य कोड बदलते हैं, और अचानक आपने एक नया बग बनाया है, क्योंकि चर एक चर नहीं है)।

+1

परेशानी यह है कि यह शुरू नहीं हो सकता है कि यह महत्वपूर्ण है लेकिन भविष्य में यह कर सकता है और आप अनजाने में एक बग –

+0

पेश करते हैं, यह एक अच्छा बिंदु है। –

0

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

हालांकि आप इसे में बस कुछ ही स्टैटिक्स के साथ सीपीपी फ़ाइलों के बहुत सारे कारण है कि सिर्फ एक फ़ाइल उन में स्टोर करने के लिए नहीं नहीं करना चाहते हैं।

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