2012-05-23 6 views
45

यदि कुछ कोड है जहां मैं जितना संभव हो सी ++ 11x एक्सटेंशन का उपयोग करना चाहता हूं, लेकिन अगर यह समर्थित नहीं है तो फ़ॉलबैक हो। वर्तमान में जीसीसी और VisualC संकलक की OSX संस्करण के लिए सी ++ 11x कोई समर्थन नहीं के बराबर है, इसलिए मैं का उपयोग करें:क्या सी ++ 11x समर्थन का पता लगाने के लिए कोई प्रीप्रोसेसर निर्देश है?

#if (defined(__APPLE__) || (defined(_WIN32))) 
    ...fallback code without C++11x ... 
#else 
    ... code using C++11x ... 
#endif 

और यह काम करता है, लेकिन वास्तव में नहीं करने के लिए सही बात है, विशेष रूप से जीसीसी के बाद से है मैकपॉर्ट्स में कंपाइलर सी ++ 11x का समर्थन करता है।

क्या #define C11X_SUPPORTED प्रकार मैक्रो है? शायद जीसीसी में कुछ ही है?

+3

समस्या यह है कि जीसीसी पूरी तरह से सी ++ 11 का समर्थन नहीं करता है, इसलिए यह वास्तव में निर्भर करता है कि आप किस विशेषताओं का उपयोग करना चाहते हैं। – juanchopanza

+4

काम को बढ़ावा देगा: http://www.boost.org/doc/libs/1_49_0/libs/config/doc/html/boost_config/boost_macro_reference.html#boost_config.boost_macro_reference.macros_that_describe_c__11_features_not_supported? – rve

+1

@rve: आपने इसे उत्तर के रूप में क्यों पोस्ट नहीं किया? यह अच्छा है। –

उत्तर

44

__cplusplus कुछ पूर्व सी ++ 11 compilers में 199711L, 201103L सी ++ 11 suporting उन में के रूप में परिभाषित किया जाना चाहिए। चाहे अभ्यास में यह बहुत मददगार है, एक और सवाल है: अधिकांश कंपाइलर्स केवल आधा रास्ते हैं, इसलिए इसे 201103L के रूप में परिभाषित नहीं किया जाना चाहिए, भले ही वे आपकी रुचि रखने वाली सुविधाओं का समर्थन करें। और यह कंपाइलर के झूठ बोलने के लिए अनदेखा नहीं है: एक कंपाइलर जो इसे 199711L के रूप में परिभाषित करता है और उदाहरण के लिए टेम्पलेट्स के लिए export का समर्थन नहीं करता है। लेकिन सुविधा परीक्षण द्वारा कोई मानक सुविधा नहीं है।

सबसे आसान समाधान किसी भी विशेष नई सुविधा का उपयोग नहीं करना है जब तक कि आप यह सुनिश्चित न कर सकें कि सभी कंपाइलर्स इसका समर्थन करते हैं। आपको वैसे भी फ़ॉलबैक कोड लिखना और समर्थन करना होगा; दो संस्करणों को क्यों बनाए रखें। इस नियम का एक अपवाद नई विशेषताएं हो सकती है जो प्रदर्शन पर प्रभाव डालती है: क्या संकलक मूवमेंट को स्थानांतरित करता है या नहीं। ऐसे मामलों में, मैं सुझाव दूंगा कि एक कंपाइलर आश्रित फ़ाइल शामिल है, जिसे आप स्वयं संकलक दस्तावेज और व्यक्तिगत परीक्षणों के आधार पर लिखते हैं; सिर्फ इसलिए कि संकलक दस्तावेज कर सकता है कि यह एक विशिष्ट सुविधा का समर्थन करता है इसका मतलब यह नहीं है कि इसका समर्थन बग-फ्री है। बस प्रति लक्षित कंपाइलर निर्देशिका बनाएं, इस फ़ाइल को वहां रखें और अपनी मेकफ़ाइल या प्रोजेक्ट फ़ाइल में उपयुक्त -I या /I विकल्प निर्दिष्ट करें।

और अपने परीक्षण की तर्ज पर कुछ होना चाहिए:

#ifdef HAS_MOVE_SEMANTICS 
... 
#endif 
बजाय

सिर्फ संकलक, संस्करण या जो कुछ भी पर।

+0

"और यह एक कंपाइलर झूठ बोलने के लिए अनसुना नहीं है" - और जीसीसी आश्चर्यजनक रूप से सच बताता है। या इसके बजाय, कुछ संस्करण करते हैं। लगभग 4.7-आश से पहले, '__cplusplus'' 1' है, जो सही है क्योंकि यह C++ 98 का ​​पूर्ण कार्यान्वयन नहीं है। फिर इसे सी ++ 98 मोड में अनुरूपता का दावा करने के लिए बदला गया था। –

+0

@SteveJessop g ++ का कभी भी C++ 98 या C++ 03 का पूर्ण कार्यान्वयन नहीं हुआ है। इसने कभी 'निर्यात' लागू नहीं किया। तो यदि '__cplusplus'' 199711L' था, तो यह झूठ बोल रहा था। (बेशक, यह इस स्थिति में अकेले होने से बहुत दूर है।) –

+7

यही मैं कह रहा हूं, जीसीसी को हाल ही में झूठ में बदल दिया गया है, जबकि पहले उसने सच कहा था। इसका कारण यह है कि यह कहना असंभव था कि क्या यह सी ++ 98 को लागू नहीं करने के बारे में सच बता रहा था, या सी ++ 11 को लागू नहीं करने के बारे में सच्चाई बता रहा था। अब जब आप C++ 98 को कार्यान्वित करने के बारे में झूठ बोलते हैं, तो आप बीच में अंतर कर सकते हैं, और जब यह C++ 11 को लागू नहीं करने के बारे में सत्य बताता है। याहू। मुझे नहीं लगता कि किसी ने कभी भी सी ++ 98 (या सी ++ 03) लागू किया है, इसलिए '__cplusplus' का सटीक मान मूल रूप से बेकार है। यह हमेशा कार्यान्वयन-विशिष्ट या झूठ बोल रहा है। –

25

आप __cplusplus मैक्रो के मान की जांच कर सकते हैं। सी ++ 11 के लिए, यह 199711L से अधिक है।

तो जैसे

#if __cplusplus > 199711L 

#endif 
+3

चेतावनी के साथ कि अभी तक * पूर्ण * समर्थन नहीं है। – juanchopanza

+1

@juanchopanza हाँ, यह किसी भी तरह से सी ++ 11 के लिए पूर्ण समर्थन की गारंटी नहीं देता है, या संकलक सी ++ 11 का समर्थन करता है (लेकिन शायद यह सबसे अच्छा है जिसे आप प्राप्त कर सकते हैं)। –

+8

साथ ही उन चेतावनी के साथ जो कंपाइलर्स झूठ बोलने के लिए जाने जाते हैं। –

7

Boost.Config लाइब्रेरी granular preprocessor macros प्रदान करता है आप किसी दिए गए सी ++ 11 फीचर की उपस्थिति के आधार पर सशर्त रूप से संकलित करने के लिए उपयोग कर सकते हैं।

(एक संकलक के लिए, सी ++ 11 समर्थन नहीं एक सब कुछ या कुछ प्रस्ताव होना चाहिए। उदाहरण के लिए, पर विचार कैसे माइक्रोसॉफ्ट cherry picked which C++11 features Visual Studio 2012 उनका मानना ​​सबसे अपने ग्राहकों को लाभ होगा के आधार पर में शामिल करने के लिए।)

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