स्थैतिक चर के प्रारंभ के संबंध में बहुत से प्रश्न पढ़ने के बाद भी मुझे यकीन नहीं है कि यह नामस्थान स्तर पर const
चर पर कैसे लागू होता है।हेडर फ़ाइल में स्थिर चर और स्थिर प्रारंभिक फ़ियास्को
static const std::string path1 = "/xyz/abc";
static const std::string path2 = "/etc";
मैं क्या static
कीवर्ड पढ़ा है के अनुसार आवश्यक नहीं है, यहां तक कि यहां पदावनत:
मैं एक हैडर फ़ाइल config.h
निर्माण स्क्रिप्ट द्वारा उत्पन्न में निम्न कोड की तरह है।
मेरा प्रश्न: क्या उपरोक्त कोड स्थिर प्रारंभिक फ़ियास्को से प्रवण है?
मैं एक हैडर फ़ाइल myclass.h
में निम्नलिखित है:
class MyClass
{
public:
MyClass(const std::string& str) : m_str(str) {}
std::string Get() const { return m_str; }
private:
std::string m_str;
}
const MyClass myclass1("test");
इस स्थिर प्रारंभ के साथ कोई समस्या पैदा होगी?
यदि मुझे सही समझा जाता है, const
आंतरिक संबंध वाले चर के कारण दोनों मामलों में कोई समस्या नहीं होनी चाहिए?
संपादित करें: (dribeas जवाब के कारण)
शायद मैं उल्लेख करना चाहिए कि मैं की तरह उपयोग के मामलों में दिलचस्पी है:
main.cpp
में:
#include <config.h>
#include <myclass.h>
std::string anotherString(path1 + myclass1.Get());
int main()
{
...
}
एक और सवाल यह उपयोग के संबंध में मामला: क्या इस मामले में संकलक path2
को अनुकूलित करेगा?
यह सच नहीं है कि 'static' केवल कार्यान्वयन फाइलों में इस्तेमाल किया जा सकता। –
बेशक, सी ++ में कार्यान्वयन फ़ाइल की कोई अवधारणा नहीं है, मैं – Philipp
शब्द बदलने की कोशिश करूंगा, मुझे लगता है कि आप जिस वाक्यांश को खोज रहे हैं वह कार्यान्वयन फ़ाइल के बजाय "अनुवाद इकाई" है। मानकों को हेडर में घोषित किया जाना चाहिए और अधिकांश एक अनुवाद इकाई में परिभाषित किया जाना चाहिए। इस मामले में, चूंकि वे स्थिर हैं और आंतरिक संबंध को निहित करते हैं, इसलिए आपको लिंक समय पर एक गुणा परिभाषित प्रतीक त्रुटि नहीं मिलती है, लेकिन आपके पास प्रत्येक शीर्षलेख इकाई में परिभाषित एक ही प्रतीक है जिसमें यह हेडर शामिल है। चूंकि उनके पास आंतरिक संबंध है, इसलिए वे लिंकिंग नहीं तोड़ते हैं, लेकिन संकलक डुप्लिकेट को खत्म नहीं कर सकता है। मैंने एक बार हेडर से तारों की परिभाषाओं को हटाकर एक निष्पादन योग्य से 8 एमबी को मुंडा दिया। – legalize