2015-09-25 6 views
9

यदि मैं एक पुस्तकालय का निर्माण कर रहा हूं जहां मुझे लगता है कि लाइब्रेरी के कुछ "क्लाइंट" केवल सी ++ 11 का उपयोग कर रहे हैं, तो क्या मैं पुस्तकालय को अपने आंतरिक के लिए सी ++ 14 का उपयोग करके संकलित कर सकता हूं? क्या एपीआई/एबीआई/सी ++ 11 बनाम लिंक संगतता समस्याएं हैं? क्या सी ++ 14 के साथ लाइब्रेरी को कार्यान्वित करना और निर्माण करना सुरक्षित है जब तक कि मैं सार्वजनिक एपीआई में कुछ नई सुविधाओं से बचता हूं, और यदि हां, तो मुझे क्या टालना चाहिए? या क्या यह अंतिम सॉफ्टवेयर प्रोजेक्ट के भीतर सी ++ 11 और सी ++ 14 मिश्रण करने के लिए स्वाभाविक रूप से असंगत है?क्या मैं सी ++ 11 क्लाइंट अनुप्रयोगों के लिए लाइब्रेरी में सी ++ 14 का उपयोग कर सकता हूं?

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

+0

आप इसे तब तक काम कर सकते हैं जब तक कि आपके क्लाइंट एक ही कंपाइलर संस्करणों का उपयोग न करें, भले ही वे C++ 14 सुविधाओं का उपयोग न करें। यदि वे कंपाइलर के एक अलग संस्करण का उपयोग करते हैं, तो निश्चित रूप से विजुअल स्टूडियो का उपयोग करते समय यह काम नहीं करेगा। –

+0

आपका सटीक कंपाइलर क्या है? क्या कंपाइलर्स इसका उपभोग करेंगे? – Yakk

+0

ओएसएक्स पर क्लैंग; या तो लिनक्स पर क्लैंग या जीसीसी; विंडोज़ पर एमएसवीएस। तर्क के लिए, आइए मान लें कि लाइब्रेरी और ऐप दोनों एक ही कंपाइलर और एक ही संस्करण का उपयोग करेंगे, इसलिए मेरा प्रश्न यह बताता है कि मैं पुस्तकालय के लिए -std = C++ 14 का उपयोग कर सकता हूं और -std = c + ऐप में +11, और सार्वजनिक एपीआई के लिए इसे ध्यान में रखने के लिए मुझे किन विशिष्ट चीज़ों को ध्यान में रखने की आवश्यकता है। –

उत्तर

7

मैं एक पुस्तकालय मैं कहाँ लगता है कि कुछ लाइब्रेरी के "ग्राहकों" केवल सी ++ 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 के उस संस्करण को कॉल न करे।

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