2014-04-24 10 views
6

मैं एक सी ++ लाइब्रेरी लिखना चाहता हूं जो डिफ़ॉल्ट रूप से नहीं-हेडर-केवल है लेकिन इसे केवल NOLIB मैक्रो परिभाषित करने वाले शीर्षलेख के रूप में उपयोग किया जा सकता है।वैकल्पिक शीर्षलेख केवल लाइब्रेरी

  • इनलाइन परिभाषाओं

foo.h

#if !defined(FOO_H) 
#define  FOO_H 

#if defined(NOLIB) 
# define MYINLINE inline 
#else 
# define MYINLINE 
#endif 

class foo 
{ 
    // ... 
}; 

#if defined(NOLIB) 
# include "foo.cc" 
#endif 

#endif // include guard 

foo.cc

0123:

मैं दो दृष्टिकोण को देखा है

#if !defined(NOLIB) 
# include "foo.h" 
#endif 

MYINLINE void foo::something() { ... } 

  • "कृत्रिम" टेम्पलेट

foo.h

#if !defined(FOO_H) 
#define  FOO_H 

#if defined(NOLIB) 
# define MYTEMPLATE template<bool DUMMY> 
# define MYFOO  foo_impl 
# define MYFOO_T foo_impl<DUMMY> 
#else 
# define MYTEMPLATE 
# define MYFOO  foo 
# define MYFOO_T foo 
#endif 

MYTEMPLATE 
class MYFOO 
{ 
    // ... 
}; 

#if defined(NOLIB) 
    using foo = foo_impl<true>; 
# include "foo.cc" 
#endif 

#endif // include guard 

foo.cc

#if !defined(NOLIB) 
# include "foo.h" 
#endif 

MYTEMPLATE 
void MYFOO_T::something() { ... } 

इन दृष्टिकोणों के पेशेवरों और विपक्ष क्या हैं? क्या बेहतर विकल्प हैं?

+0

यदि फ़ंक्शंस को रेखांकित करने के लिए पर्याप्त छोटे हैं, तो आप संभावित रूप से स्थिर पुस्तकालय में कार्यान्वयन भेज सकते हैं, या यहां तक ​​कि .cc फ़ाइलों को भी भेज सकते हैं। –

उत्तर

2

प्रत्येक दृष्टिकोण में कोई वास्तविक अंतर नहीं है क्योंकि कंपाइलर अनुकूलन के आधार पर दोनों इनलाइन विधियों या टेम्पलेट्स को आपके कोड के साथ इनलाइन डाला जा सकता है। इनलाइन बनाम टेम्पलेट्स पर चर्चा करने के बाद this पोस्ट देखें।

+0

मैं कोड ब्लोट से बहुत चिंतित नहीं हूं क्योंकि एक कारण यह है कि हेडर-केवल संस्करण आकस्मिक उपयोगकर्ता के लिए होगा। मैं परिपत्र निर्भरता या अन्य अप्रत्याशित मुद्दों जैसी समस्याओं के बारे में सोच रहा था जो एक मानक पुस्तकालय को बदलने की कोशिश कर सकते हैं। कृत्रिम टेम्पलेट भी सी ++ भाषा का एक खिंचाव लगता है। – manlio

+1

मुझे लगता है कि किसी भी मामले में देखने के लिए मुख्य बात यह है कि आपके कोड में एक उपयोग नेमस्पेस लाइन होने से बचें जो अंतिम उपयोगकर्ता के लिए समस्याएं पैदा कर सकता है, इसलिए आपको नामस्थान के भीतर सब कुछ लागू करना चाहिए (यदि आप उन्हें मुकदमा कर रहे हैं)। आपके द्वारा उल्लिखित मामलों में से किसी एक में परिपत्र निर्भरता हो सकती है। – bossbarber

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