C++ 0x/C++ 11 उपलब्धता
एक ही रास्ता जीसीसी C++ 0x/C++ 11 उपयोग कर रहा है कि क्या, आज के रूप में मैं पता लगाने के लिए जानकारी है, है पूर्वनिर्धारित के लिए जाँच करने के लिए मैक्रो __GXX_EXPERIMENTAL_CXX0X__
:
#ifdef __GXX_EXPERIMENTAL_CXX0X__
// C++11 code
#else
// C++03 code
#endif
ध्यान दें कि यह भविष्य (मैक्रो की इसलिए EXPERIMENTAL
हिस्सा) में बदल सकते हैं।
संपादित करें: वास्तव में एक बेहतर तरीका मैं का पता नहीं था जब तक @stephan यह एक टिप्पणी में कहा गया है:
16,8/1 [cpp.predefined]
__cplusplus
नाम __cplusplus
को परिभाषित किया गया है: निम्न मैक्रो नाम कार्यान्वयन से परिभाषित किया जाएगा मूल्य 201103L
जब एक सी ++ अनुवाद इकाई संकलित करता है।
157) इसका उद्देश्य यह है कि इस मानक के भविष्य के संस्करण को इस मैक्रो के मूल्य को अधिक मूल्य के साथ प्रतिस्थापित करेंगे। गैर-अनुरूप कंपिलर को अधिकतम पांच दशमलव अंकों वाले मान का उपयोग करना चाहिए।
तो मुझे लगता है कि तुम कर सकते हो:
#if defined(__cplusplus) && (__cplusplus >= 201103L)
लेकिन मुझे डर है इस पूर्व-मानक C++ 0x जीसीसी संस्करणों के साथ काम नहीं करेंगे। तो मैं शायद दोनों __GXX_EXPERIMENTAL_CXX0X__
और __cplusplus
एक साथ उपयोग कर सकेंगे:
#if defined(__GXX_EXPERIMENTAL_CXX0X__) || (defined(__cplusplus) && (__cplusplus >= 201103L))
C++ 0x/C++ 11 अनुकूलता
हालांकि यह हमेशा सिर्फ है कि क्या सी का पता लगाने के लिए पर्याप्त नहीं हो सकता है ++ 0x/C++ 11 समर्थन सक्षम है: C++ 11 समर्थन ने पूरे जीसीसी संस्करणों में बहुत कुछ बदल दिया है, न केवल कोर भाषा स्तर पर बल्कि लाइब्रेरी स्तर पर भी।
#if (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) || (__GNUC__ >= 5)) // for GCC 4.7+
स्विचिंग boost
के बीच:
मेरे सबसे अच्छा शर्त है, जो कम से कम जीसीसी संस्करण आप सी ++ 11 समर्थन के लिए स्वीकार्य लगता है खोजने के लिए और जैसे एक जीसीसी संस्करण परीक्षण के साथ ऊपर परीक्षण गठबंधन करने के लिए किया जाएगा और std
अब boost::shared_ptr
और std::shared_ptr
के बीच स्विच करने के लिए यह थोड़ा बोझिल है क्योंकि सी ++ 03 टेम्पलेटेड टाइपपीफ का समर्थन नहीं करता है। एक के लिए मैं एक template struct
में आवश्यक परिभाषाएँ लपेट होगा:
#if (defined(__GXX_EXPERIMENTAL_CXX0X__) || (defined(__cplusplus) && (__cplusplus >= 201103L))) \
&& (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) || (__GNUC__ >= 5))
template<typename T>
struct my_shared_ptr {
typedef std::shared_ptr<T> type;
// you may also want to forward make_shared etc, this is left as an exercise
};
#else
template<typename T>
struct my_shared_ptr {
typedef boost::shared_ptr<T> type;
// you may also want to forward make_shared etc, this is left as an exercise
};
#endif
my_shared_ptr<int>::type ptr(new int);
संपादित करें: (फिर) ओह मैं सिर्फ @ एक सरल गैर टेम्पलेट using
निर्देश के साथ सही shared_ptr
आयात करने की ComicSansMS के रास्ते देखा। डुनो क्यों मैंने इसके बारे में नहीं सोचा था।
फिर भी, मैं जीसीसी पर सी ++ 0x/सी ++ 11 का पता लगाने के तरीके के साथ खड़ा हूं।
यदि आप ऐसी स्थिति में हैं, तो आप केवल * हमेशा * बूस्ट का उपयोग क्यों नहीं करते? –
http://social.msdn.microsoft.com/Forums/en-US/vclanguage/thread/5213d735-58ca-452e-994f-cfc9575449a7/ – user1929959
मुझे लगता है कि आपको सी ++ 11 उपलब्धता की जांच करनी चाहिए, जैसा कि आप कर सकते हैं http://stackoverflow.com/questions/1975616/determine-c0x- उपलब्धता में देखें। – user1929959