2010-09-19 21 views
5

मैं हेडर केवल लाइब्रेरी डिज़ाइन करने की कोशिश कर रहा हूं, दुर्भाग्य से वैश्विक स्थैतिक चर (या तो वर्ग या नामस्थान में) की आवश्यकता है।सी ++ स्थिर चर

क्या हेडर केवल डिज़ाइन बनाए रखने के दौरान वैश्विक स्थिर चर होने का कोई तरीका या पसंदीदा समाधान है?

कोड here

उत्तर

10

पास कुछ विकल्प होते हैं है।

template<class T> 
struct dummy { 
    static int my_global; 
}; 

template<class T> 
int dummy<T>::my_global; 

inline int& my_global() {return dummy<void>::my_global;} 

लिंकर एक में कई परिभाषाएं मर्ज हो जाएगा: पहली बात यह है कि मेरे दिमाग में आया था सी ++ की अनुमति देता है कि वर्ग टेम्पलेट्स के स्थिर डेटा सदस्यों से अधिक अनुवाद इकाई में परिभाषित किया जाना था। लेकिन inline अकेले भी यहाँ मदद करने में सक्षम है और इस समाधान बहुत सरल है:

inline int& my_global() { 
    static int g = 24; 
    return g; 
} 

आप एक हेडर फाइल में इस इनलाइन समारोह रखा है और यह कई अनुवाद इकाइयों में शामिल कर सकते हैं। सी ++ गारंटी देता है कि इस इनलाइन फ़ंक्शन द्वारा संदर्भित संदर्भ हमेशा एक ही ऑब्जेक्ट को संदर्भित करेगा। सुनिश्चित करें कि फ़ंक्शन में बाहरी संबंध है।

+2

+1 स्थानीय स्थैतिक वैश्विक डेटा के साथ सबसे आसान तरीका है, खासकर जब से नया सी ++ 0 एक्स मानक मल्टीथ्रेड किए गए एप्लिकेशन में भी उनके सही प्रारंभिकरण की गारंटी देगा। –

+0

मुझे यह भी जोड़ना चाहिए कि दूसरे संस्करण में नकारात्मकता है - जी केवल my_global की पहली कॉल पर शुरू किया गया है। इसलिए संकलक प्रत्येक कॉल में तुलना, कूद और थ्रेडिंग गार्ड को सम्मिलित करेगा - जो कॉल धीमा कर देगा (जो लाइब्रेरी प्रवेश बिंदु के मामले में महत्वपूर्ण हो सकता है)। –

+0

@AlexEngy: इस मामले में, यह एक int है जो गतिशील प्रारंभिकरण में धागे-सुरक्षा के लिए ओवरहेड के बिना संभवतः प्रारंभिक रूप से प्रारंभ किया जाएगा। – sellibitze

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