2013-06-02 18 views
6

पर मौजूदा सी ++ कोड को पोर्ट करने के लिए कैसे करें हम सी ++ में विकसित मॉड्यूल पर काम कर रहे हैं, लेकिन नया सी ++ 11 दिया गया है, मैं उस पर माइग्रेट करने के बारे में सोच रहा हूं।सी ++ 11

कैसे आगे बढ़ें? क्या दोनों समान हैं या कुछ कंपाइलर निर्भरता है?

मेरा सॉफ़्टवेयर वर्तमान में विंडोज और लिनक्स का समर्थन करता है। मैं माइक्रोसॉफ्ट विजुअल स्टूडियो के साथ-साथ इसे बनाने के लिए जीसीसी का उपयोग कर रहा हूं।

कुल मिलाकर, यदि कोई हो तो क्या परिवर्तन की आवश्यकता है?

+2

आपको पता नहीं चलेगा कि पोर्टिंग शुरू होने तक आपको किन परिवर्तनों की आवश्यकता है। सबसे अधिक संभावना है कि, किसी भी बदलाव की आवश्यकता नहीं होगी, लेकिन आप पूर्ण अग्रेषण, प्रतिस्थापन, आदि जैसे चीजों का लाभ उठाकर लाभ प्राप्त कर सकते हैं (अक्सर आवंटित/प्रतिलिपि/मुक्त चक्रों से परहेज करते हैं)। –

+4

जब तक आप स्टोरेज अवधि विनिर्देशक के रूप में 'ऑटो' कीवर्ड का उपयोग नहीं कर रहे थे (इसे C++ 11 में टाइप अनुमान के लिए उपयोग किया जा रहा है) मुझे नहीं लगता कि आपको कुछ भी बदलना होगा। – jrok

+1

मुझे पता है कि 'सी ++ 11' नई सुविधा के साथ पिछड़ा संगत है। लेकिन क्या कोई विशिष्ट परिवर्तन उदाहरण उदाहरण कंपाइलर संस्करण है? –

उत्तर

9

पुरानी सी ++ अपने सी ++ 11 संकलक

  • की समीक्षा कैसे आप iterators का उपयोग के साथ काम करेंगे
  • समीक्षा यदि आप समारोह सूचक का उपयोग करें (हो सकता है आप सीमा-के लिए करने के लिए स्थानांतरित कर सकते हैं) (हो सकता है आप उपयोग कर सकते हैं lamdaes)
  • समीक्षा कक्षा Initiators (हो सकता है आप लिख सकते हैं आरंभीकरण सूची)
  • समीक्षा अपने सूचक का उपयोग करें (हो सकता है आप SmartPtr करने के लिए स्विच कर सकते हैं)
  • समीक्षा सूचक के साथ शून्य करने के लिए अपने उपयोग हो सकता है आप nullpt को स्थानांतरित कर सकते हैं आर
+0

अच्छी तरह से लिखित पुरानी सी ++ * शायद * एक सी ++ 11 कंपाइलर के साथ काम करेगी। अभी भी कुछ तोड़ने वाले बदलाव हैं, भले ही आपके पास कोई अपरिभाषित व्यवहार न हो। यह सुनिश्चित करने के लिए कि सबकुछ अभी भी अपेक्षित रूप से काम करता है, सबकुछ अच्छी तरह से जांचना महत्वपूर्ण है। –

2

कंपाइलर मुद्दे कुछ आसान और काम करने में आसान हैं। एक नया कंपाइलर अपनाने से कहीं ज्यादा आसान है। यदि आपके पास विकल्प है, तो अब आप जिस स्टडी लिब का उपयोग करते हैं, उसके साथ चिपके रहें, फिर अपने प्रोग्राम को C++ 11 के रूप में संकलित करने के बाद std lib को अपडेट करें। गतिशील रूप से लोड होने पर आपको लाइब्रेरी के पुराने संस्करणों के साथ चिपकने की आवश्यकता हो सकती है।

यदि आप नई सुविधाओं का लाभ लेना चाहते हैं, तो cpp11-migrate पर एक नज़र डालें। यह टूल आपके लिए कुछ नई सुविधाओं को अपनाने को स्वचालित कर सकता है जब आप सी ++ 11 को पूरी तरह प्रतिबद्ध करने के लिए भी तैयार होते हैं (मानते हैं कि आपके कंपाइलर्स उन सभी सुविधाओं का समर्थन करते हैं)।

2

माइग्रेशन? मैंने सोचा कि WG21 सभी संगतता को संरक्षित रखने के लिए कड़ी मेहनत कर रहा है। जब तक आप निर्यात का उपयोग नहीं करते हैं, आपको माइग्रेशन की आवश्यकता नहीं है, मौजूदा कोड ठीक है।

मुझे लगता है कि आप वास्तव में सी ++ 11 सुविधाओं को लेने के लिए मौजूदा कोड को दोबारा करने के लिए सवाल का मतलब है। यहां मैं रिफैक्टरिंग के बारे में सामान्य ज्ञान लागू करूंगा - कभी भी उचित लक्ष्य और मूल्य-आधारित प्रेरणा के बिना इसे न करें।

बस उस नई चमकदार सुविधाओं को पेश किया गया है जो आपके कोड पर तकनीकी ऋण लागू नहीं करता है।

मेरा सुझाव है कि आप नए कोड में नई सुविधाओं का उपयोग शुरू करें, और अधिक उदार परिवर्तन लागू करें जहां आप अलग-अलग कारणों से वैसे भी प्रतिक्रिया करते हैं। और सामान्य रूप से रीशेप में सोचना शुरू करें जब कई शैलियों को वास्तविक दर्द माना जाता है। (सी ++ के बहु-प्रतिमान प्रकृति आम तौर पर काफी ज्यादा स्वतंत्रता की अनुमति चाहिए, और समान दृष्टिकोण कभी कभी ही बाध्य करते हैं।)

नई सुविधाओं मैं पर क्या ध्यान केंद्रित था से:

  • ऑटो। मेरा नया कोड auto const और auto const& प्रकारों को छोड़कर स्थानीय लोगों से भरा है। ठीक है, एक ने ग्लोबलरेप्लेस का सुझाव दिया जो मैंने पहले कहा था: यदि आपके द्वारा उपयोग किए जाने वाले लूप के लिए इटेटरेटर उपयोग ऑटो द्वारा प्रतिस्थापित करें।
  • lambdas, यदि आप एक शॉट कार्यों के साथ algos का उपयोग
  • नई सूत्रण सामान, विशेष रूप से std::future परियोजना

पर लागू होता है अगर आप 'std :: auto_ptr' शायद एक अच्छे उम्मीदवार उपयोग करने के लिए होते हैं तो वैश्विक स्तर के लिए भी।

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

+0

"* मैंने सोचा कि WG21 सभी संगतता को संरक्षित रखने के लिए कड़ी मेहनत कर रहा है" - निश्चित रूप से, लेकिन कुछ कंपाइलर धीरे-धीरे अनुरूपता को लागू कर रहे हैं - और यह उनके अनुरूपता में सुधार करने और हमारे कार्यक्रमों को अपडेट करने के लिए मजबूर करने का एक अच्छा समय है। भी, कुछ तोड़ने वाले बदलाव हैं जहां अनुरूप प्रोग्राम std.C++ 11 का उपयोग करके संकलित करते समय त्रुटियों का उत्पादन करेंगे (रूपांतरण को संकुचित करना एक उदाहरण है)। – justin

+1

@justin: मैंने बस उस सी 2 अनुभाग को फिर से पढ़ा और फिर से निष्कर्ष निकाला, कि यदि मेरे कोडबेस पर कोई भी परिवर्तन प्रकट होता है तो उसके पास पहले से ही एक गुप्त बग है। (आईयूसी संकुचित रूपांतरण परिवर्तन केवल ब्रेस-इनिट पर लागू होता है, जहां मैं मिलान प्रकारों की अपेक्षा करता हूं।) मेरा एक्सट्रापोलेशन यह है कि माइग्रेशन सामान्य समस्याओं की तुलना में उल्लेखनीय लायक नहीं होना चाहिए वास्तविक जीवन हमें फेंकता है। लेकिन मैं किसी के अलग अनुभव या राय पर बहस नहीं करूंगा। वास्तविक जीवन की कहानियों को इकट्ठा करना दिलचस्प होगा। –

+0

ब्रेकिंग परिवर्तनों की एक पूरी सूची के लिए अली का लिंक देखें। मैं अभी सहमत नहीं था कि अस्पष्ट 'निर्यात' एकमात्र असली चिंता थी।यहां पर, मुझे लगता है कि एक संकलक पर सी ++ 11 के लिए समर्थन जोड़ने के लिए कोड की प्रति 50,000 भौतिक लाइनों में एक घंटे और एक सी ++ 11 संगत एसडीडी लाइब्रेरी उस बिंदु पर ले जाती है जहां यह ठीक बनाता है और लिंक करता है। निम्नलिखित libs/compilers तेजी से जाओ। खराब बनाए रखा कोडबेस और परियोजनाओं धीमे। परीक्षण छोड़ा गया। कि गोद लेने के चरण में शायद अधिकांश टीमों को कुछ समर्पित दिन खर्च होंगे - सप्ताह में सबसे अधिक, और कम अंत में घंटे। (cont) – justin

2

जैसा कि अन्य ने बताया है, आपका कोड शायद ठीक से संकलित होगा। आप उत्सुक क्या गलत हो सकता है, तो देखने के

What breaking changes are introduced in C++11?

आप सी ++ 11 सुविधाओं का उपयोग करने के लिए अपने पुराने कोड को बदलने की योजना बना रहे हैं, तो मैं Baget's answer को auto जोड़ना होगा।