क्या संकलित C ++ 11 पुस्तकालय (lib, dll, आदि) को पुराने C ++ संकलक में जोड़ा जा सकता है?


12

क्या C ++ 11 में लिखे गए बाहरी पुस्तकालयों के साथ पुराने C ++ कंपाइलर (जैसे VS2008 और gcc3.4) लिंक किए जा सकते हैं?

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

मैं एक छोटी सी लाइब्रेरी विकसित कर रहा हूं, जिसके एपीआई को अभी भी C ++ 03 उपयोगकर्ताओं का समर्थन करना चाहिए। इसलिए, आगे देखते हुए, मैं सोच रहा हूं कि क्या std::unique_ptrइस तरह की सहायक विशेषताओं का उपयोग करके मेरी लाइब्रेरी को लागू करना ठीक है या क्या मुझे बस साथ रहना है boost::?

जवाबों:


10

बशर्ते आपकी लाइब्रेरी अपने कार्यान्वयन में केवल C ++ 11 का उपयोग करती है और C ++ 11 सुविधाओं या प्रकारों को सार्वजनिक रूप से उजागर नहीं करती है, और विशेष रूप से यदि आप स्थैतिक लिंकेज का उपयोग करते हैं, तो हाँ, यह संभव है और मानक भी।

उस सामान्य मामले पर विचार करें जहां एक पुस्तकालय सी-स्तरीय इंटरफ़ेस (ग्राहकों की व्यापक विविधता द्वारा प्रयोग करने योग्य) को उजागर करता है, लेकिन जिसे C ++ में आंतरिक रूप से लागू किया जाता है। इस तरह के पुस्तकालय से जुड़ने वाले ग्राहकों को केवल सार्वजनिक बाइनरी एपीआई (निर्यात कार्यों) के बारे में चिंता करने की आवश्यकता होती है, जिसे आपने अधिकतम संगतता के लिए विरासत सी / सी ++ के लिए विवश किया होगा। एक जावा प्रोग्राम सी-लेवल एपीआई से लिंक कर सकता है जो आंतरिक रूप से C ++ में लागू होते हैं। इसका मतलब यह नहीं है कि जावा को "C ++ का समर्थन" करने की आवश्यकता है। इसी तरह, एक पुरानी शैली वाला सी / सी ++ क्लाइंट सी-लेवल या सी ++ - लेवल एपीआई से लिंक कर सकता है, जो आंतरिक रूप से सी ++ के कुछ और एवेंट-गार्डे संस्करण का उपयोग करता है। दो अलग-अलग चीजें: लाइब्रेरी के इंटरफ़ेस से लिंक करने के लिए क्या आवश्यक है, और लाइब्रेरी खुद आंतरिक रूप से क्या लिंक करती है (या स्टैटिक रूप से खींचती है)।

आप बस अपने पुस्तकालय के ग्राहकों को अपने कार्यान्वयन की निर्भरता के लिए उजागर नहीं करते हैं।

यदि आप अपने पुस्तकालय में अपनी निर्भरता (C ++ 11 या अन्य कुछ) को सांख्यिकीय रूप से जोड़ सकते हैं, तो यह स्वच्छ और आत्म-निहित है। पुस्तकालय एक सच्चा ब्लैक बॉक्स है: कुछ भी नहीं लेकिन बायोटेक। लेकिन यहां तक ​​कि अगर आपका पुस्तकालय "अंतर्निहित गतिशील" लिंकेज के माध्यम से आपके आश्रितों से जुड़ता है (अन्वेषण लोडलिफ्ट / गेटप्रोकैड्रेस प्रकार और * nix और OS X पर इसी तरह के तरीकों से भ्रमित नहीं होना चाहिए), तो पुराने ग्राहकों को अभी भी उस लाइब्रेरी से लिंक करने में सक्षम होना चाहिए सार्वजनिक इंटरफ़ेस, भले ही वे लाइब्रेरी से लिंक न कर सकें, लाइब्रेरी निर्भर करती है


1
महान! ठीक यही मैं उम्मीद कर रहा था। मैं C ++ 11 का बड़े पैमाने पर उपयोग करने का इरादा नहीं रखता, लेकिन यह जानना अच्छा है कि मैं एक लैंबडा फ़ंक्शन में पॉप कर सकता हूं या सुविधाजनक होने पर मेरे छिपे हुए कार्यान्वयन में दो। C और Java उपमाएँ समझ में आती हैं। धन्यवाद।
कोनाफा

4

लगता है कि आप दूसरों के उपयोग के लिए एक नई लाइब्रेरी लिखना चाहते हैं, और आप अपनी कार्यान्वयन भाषा के रूप में C + 11 का उपयोग करना चाहते हैं। विचार करने के लिए कई मुद्दे हैं:

  • C ++ का नया संस्करण पेश करने से आप अपने पुस्तकालय के साथ नए C ++ रनटाइम पुस्तकालयों को तैनात करने की आवश्यकता का परिचय देंगे, क्या यह ठीक है?
  • आपको अपने सार्वजनिक इंटरफ़ेस में नए C + 11 प्रकारों का उपयोग नहीं करना चाहिए , अन्यथा वे इसे कॉल नहीं कर पाएंगे।
  • सामान्य तौर पर, आपको जटिल प्रकारों से बचना चाहिए, जैसे कि unique_ptr, यहां तक ​​कि वेक्टर, आदि जब तक आप अपनी लाइब्रेरी को स्रोत कोड के रूप में वितरित नहीं कर रहे हैं, आपकी लाइब्रेरी में ऑब्जेक्ट्स का लेआउट क्लाइंट कोड में लेआउट से भिन्न हो सकता है। सरल प्रकार के साथ छड़ी, जिसमें ऑब्जेक्ट लेआउट विविधताओं का कोई जोखिम नहीं है।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.