2011-08-17 16 views
9

कोड के लिए मैं वर्तमान में काम कर रहा हूं, हमें कभी-कभी कुछ पुराने सिस्टम पर संकलन करने की आवश्यकता होती है पुराने कंपाइलर्स के साथ (उदाहरण के लिए- हम पुराने आईबीएम ब्लूजीन/एल पर सिम्स चलाते हैं, जो समर्थन अनुबंध कुछ पुराने सी ++ कंपाइलर को निर्देशित करता है)। कोड स्वयं shared_ptrs का उपयोग करता है, और मूल रूप से std :: tr1 :: shared_ptr का उपयोग करने के लिए लिखा गया था। पुरानी ब्लूजिन मशीन पर संकलन करते समय, मुझे जल्दी से एहसास हुआ कि इसमें कोई tr1 :: कार्यान्वयन नहीं है, और इसलिए मैंने :: shared_ptr को बढ़ावा देने के लिए स्विच किया। बाहर निकलता है एक बूस्ट :: tr1 :: shared_ptr भी है। अब जब हमारे शोध समूह के बाहर कोड का व्यापक रूप से उपयोग किया जा रहा है, पोर्टेबिलिटी और भी महत्वपूर्ण हो रही है।विकसित C++ std :: नेमस्पेस को कैसे संभालें? उदाहरण: std :: tr1 :: shared_ptr vs. std :: shared_ptr बनाम boost :: shared_ptr बनाम boost :: tr1 :: shared_ptr

बड़े-आइश कोडबेस में विकसित मानक लाइब्रेरी समस्याओं के इन प्रकारों को संभालने के लिए (द) सर्वोत्तम अभ्यास क्या है? मुझे लगता है कि नए सी ++ 11 मानक में, shared_ptr अब tr1 नेमस्पेस में नहीं होगा, जो एक और संभावित जोड़ता है: std :: shared_ptr, हालांकि मैं अनुमान लगा रहा हूं कि इसके लिए व्यापक समर्थन एक तरीका होगा। यदि संभव हो तो मैं नवीनतम मानक का उपयोग करना चाहता हूं, लेकिन पोर्टेबिलिटी को बनाए रखने की आवश्यकता है। क्या मुझे बस बढ़ावा देने के साथ रहना चाहिए? अपने प्रश्न

boost::tr1 को

+0

वहां पहले से ही compilers हैं जहां 'std :: shared_ptr' वीसी -2010 और जी ++ के हाल के संस्करणों की तरह उपलब्ध है।यदि आपको विभिन्न कंपाइलरों की भीड़ का समर्थन करने की आवश्यकता है, तो बूस्ट के साथ चिपकना शायद सबसे आसान है। :) – Sven

+0

सिर्फ इसलिए कि shared_ptr को नामस्थान std :: में जोड़ा जाएगा, इसका मतलब यह नहीं है कि यह नामस्थान std :: tr1 :: से * हटा दिया जाएगा *। मुझे पता है कि जीसीसी/libstdC++ आगे बढ़ने दोनों बनाए रखेंगे। वास्तव में, मुझे यकीन है कि विजुअल स्टूडियो वही होगा। – emsr

+0

मुझे लगता है कि यदि आप चारों ओर देखते हैं, तो कम से कम पिछले दो वर्षों में std :: shared_ptr के लिए समर्थन अधिकांश कंप्यूटर्स में बहुत व्यापक है। मैं std :: पहले के साथ चिपके रहूंगा, फिर std :: tr1 :: के लिए देखें, फिर उस क्रम में बढ़ावा देने का प्रयास करें। – emsr

उत्तर

8

आंशिक जवाब यह है कि एक tr1 नहीं है मानक पुस्तकालय कार्यान्वयन के लिए वास्तव में आविष्कार किया है। here से प्रलेखन के शब्दों में:

TR1 पुस्तकालय के मानक पुस्तकालय एक्सटेंशन पर सी ++ तकनीकी रिपोर्ट एक कार्यान्वयन प्रदान करता है। यह लाइब्रेरी TR1 घटकों को लागू नहीं करती है, बल्कि यह एक पतली आवरण है जिसमें आपके मानक लाइब्रेरी के TR1 कार्यान्वयन (यदि इसमें कोई है) शामिल होगा, अन्यथा यह में बूस्ट लाइब्रेरी समकक्ष शामिल होंगे, और उन्हें नामस्थान std में आयात करें: : tr1

+0

टिप के लिए बहुत बहुत धन्यवाद- मुझे नहीं पता था कि boost :: tr1 std :: tr1 में आयात किया गया है। बढ़ावा देने के बाद :: tr1 अब मुझे और अधिक समझ में आता है। चीयर्स! – MarkD

1

क्यों कुछ विशेष संकलन समय जांच नहीं है? एक तरह से:

#if __GNUC__ > 3 
    #define BOOST boost:: 
#else 
    #define BOOST boost::tr1:: 
#endif 

BOOST shared_ptr<...> ... 

आप को बढ़ावा देने के पुस्तकालयों में देख सकते हैं, वे संकलक/संस्करण का पता लगाने कोड का एक बहुत कुछ है।

, मैक्रोज़ के बारे में जानकारी के लिए this question देखें विशेष रूप से इस लिंक: http://predef.sourceforge.net/

+0

मैं इसी तरह करता हूं सिवाय इसके कि मैं std :: tr1 और std :: का उपयोग करता हूं। – emsr

+0

मैं वास्तव में ऐसा कुछ करने के लिए प्रयोग करता था क्योंकि यह करना सबसे आसान काम था। जब यह अधिक उलझन में शुरू हो गया (कुछ कंप्यूटर्स के पास मामूली संस्करणों में टीआर 1 समर्थन में बदलाव आया है, उदाहरण के लिए) मैंने लाइब्रेरी कोड में 'std' का उपयोग करने का निर्णय लिया और उपयोगकर्ता को अपने पर्यावरण को अनुकूलित करने दिया, वह मुझे इससे बेहतर जानता है। –

9

यह पता लगाने के लिए कि किस नामस्थान को साझा_प्टर है, आपको ऑटोकॉन्फ़ की तरह कुछ चाहिए - यही वजह है कि ऑटोकॉन्फ़ बनाया गया था (प्लेटफ़ॉर्म/कंपाइलर विविधता का पता लगाना)। std::tr1::shared_ptr, boost::tr1::shared_ptr और boost::shared_ptr के लिए

AC_LANG(C++) 

AC_MSG_CHECKING([for std::shared_ptr]) 
AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
    [[#include <memory>]] 
    [[std::shared_ptr<int> have_shared_ptr;]]) 
], [ 
    AC_MSG_RESULT([yes]) 
    AC_DEFINE_UNQUOTED([HAVE_STD_SHARED_PTR], 1, [Define to 1 if you have the `std::shared_ptr' class.]) 
], [ 
    AC_MSG_RESULT([no]) 
    AC_DEFINE_UNQUOTED([HAVE_STD_SHARED_PTR], 0, [Define to 1 if you have the `std::shared_ptr' class.]) 
]) 

दोहराएँ: आप के साथ ऐसा कर सकते हैं।

फिर आप एक shared_ptr.hpp फ़ाइल है कि बना सकते हैं कुछ की तरह:

#include <config.h> 

#if defined(HAVE_STD_SHARED_PTR) 
    namespace ptr = std; 
#elif defined(HAVE_STD_TR1_SHARED_PTR) 
    namespace ptr = std::tr1; 
#elif defined(HAVE_BOOST_SHARED_PTR) 
    namespace ptr = boost; 
#elif defined(HAVE_BOOST_TR1_SHARED_PTR) 
    namespace ptr = boost::tr1; 
#else 
# error No shared_ptr found. 
#endif 

... जो आप तो के रूप में उपयोग कर सकते हैं:

ptr::shared_ptr<int> pointer(new int(5)); 
+1

ऑटोकॉन्फ उदाहरण में आपकी दूसरी टिप्पणी उलटा होना चाहिए – Attila

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