2013-01-03 11 views
16

कोई भी जानता है कि __cplusplus को मेरे विजुअल स्टूडियो 2012 सी ++ प्रोजेक्ट में 199711L (जो "पुराना" सी ++ है) के रूप में परिभाषित किया गया है? क्या यह 201103L नहीं कहना चाहिए क्योंकि वीएस 2012 में अब सी ++ 11 समर्थन है? यहां तक ​​कि अगर मैं सी ++ 11 हेडर भी शामिल करता हूं तो यह अभी भी गलत तरीके से परिभाषित किया गया है। कोई सुराग?विजुअल स्टूडियो 2012 __cplusplus और सी ++ 11

उत्तर

14

यह पहले से ही समीक्षा के लिए माइक्रोसॉफ्ट के पास जमा कर दिया गया है

A value of predefined macro __cplusplus is still 199711L

+0

धन्यवाद। मैंने बग रिपोर्ट में अपनी टिप्पणी जोड़ दी है। –

+1

हमारे पास अब 2014 है, वीएस 2013 बाहर है और ऐसा लगता है कि ध्वज अभी भी पुराने संस्करण की रिपोर्ट करता है (उपरोक्त लिंक में चर्चा का पालन करें)। यदि आप समर्थित सुविधाओं पर यहां देखते हैं, तो वे सी ++ 14: http://msdn.microsoft.com/en-us/library/hh567368.aspx में भी खींचना शुरू करते हैं - "विजुअल स्टूडियो 2013 में विजुअल सी ++ इस कवरेज को और भी आगे बढ़ाता है, और कुछ चुनिंदा सी ++ 14 लाइब्रेरी फीचर्स का भी समर्थन करता है। " यह मैं वास्तव में समझ में नहीं आता, क्यों हर कोई चुन सकता है कि कौन सी विशेषताओं को लागू करना है। यह पोर्टेबिलिटी को और अधिक बर्बाद कर देगा! – flohack

+1

@flohack - यदि आप उपयुक्त तकनीकी वार्ता देखते हैं, तो आप पाएंगे कि विभिन्न सुविधाओं को लागू करने के लिए वीएस टीम पर वर्कलोड ... अच्छी तरह से ... अलग है। कुछ चीजें तेज हैं, अन्य नहीं हैं। वे लाइब्रेरी में 'make_unique' जोड़ने जैसी कुछ तेज़ चीजें करते हैं, क्योंकि इसमें कोई समय नहीं लगता है। आप यह भी सीखेंगे कि एमएस मानकीकरण के लिए कई चीजें अग्रणी है, जैसे एसिंक/प्रतीक्षा प्रस्ताव, और इसलिए वे इसे प्राथमिकता देते हैं ताकि हमारे पास एक कार्य कार्यान्वयन हो जिसके साथ हमारे विचार/प्रस्तावों को परिशोधित किया जा सके। ऐसा नहीं है कि वे क्या कार्यान्वित करना चुन रहे हैं, यह है कि वे कब चुन रहे हैं। – Mark

7

यह वास्तव में आप क्या उम्मीद करते हैं कि वास्तव में मतलब करने के लिए मैक्रो पर निर्भर करता है। 201103L का मतलब होना चाहिए "यह कंपाइलर संकलक और पुस्तकालय दोनों में सी ++ 11 के सभी का पूरी तरह से समर्थन करता है?" इसका मतलब यह होना चाहिए "यह कंपाइलर सी ++ 11 के कुछ उचित सबसेट का समर्थन करता है?" इसका मतलब यह होना चाहिए "यह कंपाइलर कम से कम एक सी ++ 11 सुविधा किसी भी तरीके, आकार या रूप में समर्थन करता है?"

यह वास्तव में प्रत्येक कार्यान्वयन पर निर्भर करता है कि यह तय करने के लिए कि संस्करण संख्या को कब टक्कर देना है। विजुअल स्टूडियो क्लैंग और जीसीसी से अलग है, क्योंकि इसमें कोई अलग सी ++ 03 संकलन मोड नहीं है; यह सुविधाओं का एक विशिष्ट सेट प्रदान करता है, और यही वह प्रदान करता है।

सामान्य रूप से, कुछ सुविधा का उपयोग करने का निर्णय लेने के लिए एक एकल मैक्रो एक उपयोगी टूल नहीं है। Boost.Config एक बहुत अधिक विश्वसनीय तंत्र है। मानक समिति investigating ways of dealing with this problem मानक के भविष्य के संस्करणों में है।

4

मैं इस पर निकोल के साथ हूं। __cplusplus >= 201103L के लिए परीक्षण करने का एकमात्र कारण यह जांचना है कि आप नई सुविधाओं का उपयोग कर सकते हैं या नहीं। यदि एक कंपाइलर केवल नई सुविधाओं का आधा उपयोग करता है लेकिन __cplusplus के नए मान का उपयोग करता है, तो यह __cplusplus >= 201103L द्वारा संरक्षित बहुत से वैध C++ 11 कोड को संकलित करने में विफल रहेगा (मेरे पास कुछ है जो thread_local और *this संदर्भों का उपयोग करता है)। यदि दूसरी ओर यह 199711L रखता है, तो यह सुरक्षित C++ 98 कोड का उपयोग करेगा, जो अभी भी ठीक है। यह इस तरह के कुछ अनुकूलन को याद कर सकता है, लेकिन आप अभी भी यह पता लगाने के लिए अन्य तरीकों का उपयोग कर सकते हैं कि कोई विशिष्ट सुविधा उपलब्ध है या नहीं (कंपाइलर संस्करण, __GXX_EXPERIMENTAL_CXX0X__ जैसे कंपाइलर विशिष्ट मैक्रोज़, आपके लिए कंपाइलर मैक्रोज़ की जांच करने वाले मैक्रोज़ को बढ़ावा दें)। क्या मायने रखता है एक सुरक्षित डिफ़ॉल्ट है।

वहाँ __cplusplus के नए मूल्य के लिए स्विच करने के लिए 2 संभावित कारण हैं:

  • अपने संकलक है के लिए सी ++ 11 (या काफी पास, वहाँ हमेशा कीड़े हो जाएगा)
  • पूर्ण समर्थन यह आपके कंपाइलर का एक प्रयोगात्मक तरीका है जिसे उत्पादन में उपयोग नहीं किया जाना चाहिए, और सामान्य रूप से गायब होने वाली सुविधाओं को बग के रूप में गिना जाएगा।

जहां तक ​​मुझे पता है, स्विच किए गए सभी कंपाइलर्स दूसरी श्रेणी में हैं।

मेरा मानना ​​है कि कुछ कंपाइलर विक्रेता __cplusplus (लागू करने के लिए सबसे आसान सी ++ 11 सुविधा, अच्छे प्रचार) के मूल्य को बदलने के बारे में बहुत उत्साहित हैं, और यह अच्छा है कि कुछ अधिक रूढ़िवादी हैं।

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