2010-02-08 18 views
27

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

किसी लाइब्रेरी को केवल हेडर बनाने के लिए कैसे संशोधित करता है?

उत्तर

45

आप inline कीवर्ड का उपयोग कर सकते हैं:

// header.hpp (included into multiple translation units) 

void foo_bad() {} // multiple definitions, one in every translation unit :(

inline void foo_good() {} // ok :) 

inline लिंकर बस एक परिभाषा लेने और बाकी त्यागने के लिए अनुमति देता है।

(जैसे, अगर उन परिभाषाओं वास्तव में मेल नहीं खाते, तो आप अपरिभाषित व्यवहार का एक अच्छा खुराक प्राप्त ...!)


के रूप में एक अलग रूप में, सदस्य कार्यों एक वर्ग-प्रकार में परिभाषित किया, परोक्ष चिह्नित कर रहे हैं inline:

struct myclass 
{ 
    void i_am_inline_implicitly() 
    { 
     // because my definition is here 
    } 

    void but_i_am_not(); 
    void neither_am_i(); 
}; 

inline void myclass::but_i_am_not() 
{ 
    // but that doesn't mean my definition cannot be explicitly inline 
} 

void myclass::neither_am_i() 
{ 
    // but in this case, no inline for me :(
} 
+4

+1। यह आधुनिक कंपाइलरों के लिए सभी इनलाइन साधनों का बहुत अधिक है। –

+0

नाइटपिक: यह ओडीआर को तोड़ने की अनुमति नहीं देता है; यह फ़ंक्शन को कई बार परिभाषित करने की अनुमति देता है। परिभाषाओं को अभी भी मेल खाना है। –

+0

@ बिलीओनेल: एक अच्छा नाइटपिक। संपादित। – GManNickG

1

एक स्थान पर संकलित भागों के लिए हेडर गार्ड का उपयोग करें।

+4

शीर्षलेख गार्ड केवल प्रति-अनुवाद इकाई कार्य करते हैं। – GManNickG

+0

@GMan: आपको और क्या चाहिए? –

+8

वैसे मैं तुम्हारे बारे में नहीं जानता; लेकिन मेरी परियोजनाओं में एक से अधिक फाइलें शामिल हैं। – GManNickG

6

उपयोग हैडर गार्ड लिज़ पता चलता है और भूल नहीं है अपने समारोह तरीकों से पहले "इनलाइन" डाल करने के लिए के रूप में।

यानी

#ifndef MY_HEADER_H_ 
#define MY_HEADER_H_ 

inline RetType FunctionName(ParamType1 param1, ParamType2 param2) 
{ 
    // Function body 
    return retType; 
} 

#endif 
+0

नाइटपिक: सी ++ में, विधि जैसी कोई चीज़ नहीं है। सदस्य कार्य और गैर-कार्य कार्य हैं। –

+1

@ बिलीओनेल यह सच नहीं है; जैसा कि आप पृष्ठ 587 पर स्ट्रॉस्ट्रप्स "द सी ++ प्रोग्रामिंग भाषा" में पढ़ सकते हैं, वर्चुअल सदस्य फ़ंक्शंस को "कभी-कभी विधियों कहा जाता है"। –

4

इसके अलावा, मुझे लगता है कि आप अपने हैडर-केवल-पुस्तकालय कोड में वैश्विक चर या स्थैतिक चर के किसी भी उपयोग से बचने के लिए की आवश्यकता होगी।

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