मैं एक पुस्तकालय मैं कहाँ लगता है कि कुछ लाइब्रेरी के "ग्राहकों" केवल सी ++ 11 का उपयोग किया जा सकता है सकते हैं संकलन का निर्माण कर रहा हूँ, मैं पुस्तकालय ही अपने आंतरिक के लिए सी ++ 14 का उपयोग कर?
हां, सामान्य रूप से यह संभव होना चाहिए।
मैं वास्तव में फाइल सिस्टम टीएस के जीसीसी के कार्यान्वयन के लिए करता हूं। <experimental/filesystem>
हेडर शुद्ध सी ++ 11 में लिखा गया है और इसे C++ 11 क्लाइंट्स द्वारा शामिल किया जा सकता है, लेकिन libstdc++fs.a
में कार्यान्वयन सी ++ 14 में लिखा गया है।
क्या एपीआई/एबीआई/सी ++ 11 बनाम संगतता समस्याएं हैं?
के बीच सी ++ 11 और सी ++ 14 में कोई बदलाव नहीं कि अपने लिंक-टाइम अनुकूलता को तोड़ने के लिए कार्यान्वयन की आवश्यकता होती है। इसका मतलब यह नहीं है कि कार्यान्वयन नहीं तोड़ देगा, लेकिन उन्हें इसकी आवश्यकता नहीं है।
जीसीसी के लिए मेरा मानना है कि सी ++ 11 और सी ++ 14 पूरी तरह से एपीआई और एबीआई संगत हैं, constexpr
और नीचे उल्लिखित आकार-आकार के मुद्दों को छोड़कर।
क्या सी ++ 14 के साथ लाइब्रेरी को कार्यान्वित करना और निर्माण करना सुरक्षित है जब तक कि मैं सार्वजनिक एपीआई में कुछ नई सुविधाओं से बचता हूं, और यदि हां, तो मुझे क्या टालना चाहिए?
यह आपके कंपाइलर पर निर्भर करता है, लेकिन सिद्धांत रूप में यह संभव है।
जाहिर है कि में मान्य नहीं हैं किसी भी सी ++ 14 भाषा सुविधाओं से बचने सी ++ 11 और किसी भी सी ++ 14 पुस्तकालय संस्थाओं (जैसे समारोह वापसी प्रकार कटौती, या auto
पैरामीटर या चर टेम्पलेट के साथ सामान्य lambdas के रूप में) , जैसे std::make_unique
, std::integer_sequence, or
std :: shared_timed_mutex`।
सी ++ 14 में लगभग सभी बदलावों की एक सूची SD-6 में पाई जा सकती है।
यह देखने के लिए एक बात यह है कि गैर-स्थैतिक constexpr
सदस्य फ़ंक्शन का अर्थ सी ++ 11 और सी ++ 14 के बीच बदल गया है। सी ++ 11 में इस सदस्य समारोह const
है:
struct X {
constexpr int foo();
};
सी ++ 14 में यह गैर स्थिरांक है। दोनों के साथ सी ++ 11 और सी ++ 14 संगत होना करने के लिए आप स्पष्ट रूप से यह const
के रूप में योग्य होना चाहिए:
struct X {
constexpr int foo() const;
};
दोनों सी ++ 11 और सी ++ 14 में एक ही बात का मतलब है।
एक और चेतावनी सी ++ 11 और सी ++ 14 में इस ऑपरेटर कुछ अलग मतलब है कि है:
void operator delete(void*, std::size_t);
सी ++ 11 ग्राहक कोड है कि समारोह तो अपने पुस्तकालय सी ++ 14 में संकलित को परिभाषित करता है, तो सामान्य operator delete(void*)
की बजाय इसे कॉल कर सकता है और संभवतः गलत चीज़ करेगा। यह शायद बहुत असामान्य है और वास्तविक कोड में कोई समस्या नहीं है, लेकिन यह संभव है। G ++ और Clang आपको नई सुविधा को अक्षम करने के लिए -fno-sized-deallocation
के साथ C++ 14 कोड संकलित करने की अनुमति देता है, ताकि आपका C++ 14 लाइब्रेरी कोड कभी भी operator delete
के उस संस्करण को कॉल न करे।
आप इसे तब तक काम कर सकते हैं जब तक कि आपके क्लाइंट एक ही कंपाइलर संस्करणों का उपयोग न करें, भले ही वे C++ 14 सुविधाओं का उपयोग न करें। यदि वे कंपाइलर के एक अलग संस्करण का उपयोग करते हैं, तो निश्चित रूप से विजुअल स्टूडियो का उपयोग करते समय यह काम नहीं करेगा। –
आपका सटीक कंपाइलर क्या है? क्या कंपाइलर्स इसका उपभोग करेंगे? – Yakk
ओएसएक्स पर क्लैंग; या तो लिनक्स पर क्लैंग या जीसीसी; विंडोज़ पर एमएसवीएस। तर्क के लिए, आइए मान लें कि लाइब्रेरी और ऐप दोनों एक ही कंपाइलर और एक ही संस्करण का उपयोग करेंगे, इसलिए मेरा प्रश्न यह बताता है कि मैं पुस्तकालय के लिए -std = C++ 14 का उपयोग कर सकता हूं और -std = c + ऐप में +11, और सार्वजनिक एपीआई के लिए इसे ध्यान में रखने के लिए मुझे किन विशिष्ट चीज़ों को ध्यान में रखने की आवश्यकता है। –