उत्तर के दो भाग हैं। कंपाइलर स्तर पर संगतता और लिंकर स्तर पर संगतता। पूर्व से शुरू करते हैं।
मान लीजिए कि सभी हेडर C ++ 11 में लिखे गए थे
समान संकलक का उपयोग करने का अर्थ है कि समान मानक लाइब्रेरी हेडर और स्रोत फाइलें (कंपाइलर से जुड़े प्याज) का उपयोग लक्ष्य C ++ मानक के बावजूद किया जाएगा। इसलिए, मानक लाइब्रेरी की हेडर फाइलें संकलक द्वारा समर्थित सभी C ++ संस्करणों के साथ संगत होने के लिए लिखी जाती हैं।
कहा कि, यदि अनुवाद इकाई के संकलन के लिए प्रयुक्त संकलक विकल्प किसी विशेष C ++ मानक को निर्दिष्ट करते हैं, तो जो भी सुविधाएँ केवल नए मानकों में उपलब्ध हैं, वे सुलभ नहीं होनी चाहिए। यह __cplusplus
निर्देश का उपयोग करके किया जाता है । यह कैसे उपयोग किया जाता है के एक दिलचस्प उदाहरण के लिए वेक्टर स्रोत फ़ाइल देखें । इसी तरह, संकलक मानक के नए संस्करणों द्वारा प्रस्तुत किसी भी वाक्यविन्यास सुविधाओं को अस्वीकार कर देगा।
उस सभी का मतलब है कि आपकी धारणा केवल आपके द्वारा लिखी गई हेडर फाइलों पर लागू हो सकती है। ये हेडर फाइलें विभिन्न C ++ मानकों को लक्षित करने वाली विभिन्न अनुवाद इकाइयों में शामिल होने पर असंगति पैदा कर सकती हैं। यह C ++ मानक के अनुलग्नक सी में चर्चा की गई है। 4 खंड हैं, मैं केवल पहले एक पर चर्चा करूंगा, और बाकी का संक्षेप में उल्लेख करूंगा।
C.3.1 क्लॉज 2: लेक्सिकल कन्वेंशन
एकल उद्धरण C ++ 11 में एक वर्ण शाब्दिक परिसीमन करते हैं, जबकि वे C ++ 14 और C ++ 17 में अंक विभाजक हैं। मान लें कि आपके पास शुद्ध C ++ 11 हेडर फ़ाइलों में से एक में स्थूल परिभाषा है:
#define M(x, ...) __VA_ARGS__
int x[2] = { M(1'2,3'4) };
दो अनुवाद इकाइयों पर विचार करें जिनमें हेडर फ़ाइल शामिल है, लेकिन क्रमशः C ++ 11 और C ++ 14 को लक्षित करें। C ++ 11 को लक्षित करते समय, उद्धरणों के भीतर अल्पविराम को पैरामीटर विभाजक नहीं माना जाता है; केवल एक बार पैरामीटर है। इसलिए, कोड इसके बराबर होगा:
int x[2] = { 0 };
दूसरी ओर, C ++ 14 को लक्षित करते समय, एकल उद्धरणों को अंक विभाजकों के रूप में व्याख्या की जाती है। इसलिए, कोड इसके बराबर होगा:
int x[2] = { 34, 0 };
यहाँ मुद्दा यह है कि शुद्ध C ++ 11 हेडर फ़ाइलों में से एक में एकल उद्धरणों का उपयोग करने से अनुवाद इकाइयों में आश्चर्यजनक बग हो सकते हैं जो C ++ 14/17 को लक्षित करते हैं। इसलिए, भले ही हेडर फ़ाइल C ++ 11 में लिखी गई हो, यह सुनिश्चित करने के लिए सावधानीपूर्वक लिखा जाना चाहिए कि यह मानक के बाद के संस्करणों के साथ संगत है। __cplusplus
निर्देश यहाँ उपयोगी हो सकता है।
मानक से अन्य तीन खंडों में शामिल हैं:
C.3.2 खण्ड 3: मूल अवधारणाएं
परिवर्तन : नया सामान्य (गैर-प्लेसमेंट) डीलर
तर्क : आकार के निपटारे के लिए आवश्यक है।
मूल सुविधा पर प्रभाव : मान्य C ++ 2011 कोड एक वैश्विक प्लेसमेंट आवंटन फ़ंक्शन और डीलक्लोलेशन फ़ंक्शन की घोषणा कर सकता है:
void operator new(std::size_t, std::size_t);
void operator delete(void*, std::size_t) noexcept;
इस अंतर्राष्ट्रीय मानक में, हालांकि, ऑपरेटर हटाने की घोषणा एक पूर्वनिर्धारित सामान्य (गैर-प्लेसमेंट) ऑपरेटर हटाने (3.7.4) से मेल खा सकती है। यदि ऐसा है, तो कार्यक्रम बीमार है, क्योंकि यह वर्ग के सदस्य आवंटन कार्यों और डीलरशिप कार्यों (5.3.4) के लिए था।
C.3.3 क्लॉज 7: घोषणाएं
परिवर्तन : कॉन्स्टैक्स गैर-स्थैतिक सदस्य फ़ंक्शंस अव्यवस्थित रूप से कॉन्स्टेबल सदस्य फ़ंक्शंस नहीं हैं।
Rationale : ऑब्जेक्ट को म्यूट करने के लिए constexpr सदस्य फ़ंक्शन को अनुमति देने के लिए आवश्यक है।
मूल सुविधा पर प्रभाव : मान्य C ++ 2011 कोड इस अंतर्राष्ट्रीय मानक में संकलित करने में विफल हो सकता है।
उदाहरण के लिए, निम्नलिखित कोड C ++ 2011 में मान्य है लेकिन इस अंतर्राष्ट्रीय मानक में अमान्य है क्योंकि यह एक ही सदस्य फ़ंक्शन को दो बार अलग-अलग रिटर्न के साथ घोषित करता है:
struct S {
constexpr const int &f();
int &f();
};
C.3.4 क्लाज 27: इनपुट / आउटपुट लाइब्रेरी
बदलें : परिभाषित नहीं किया गया है।
औचित्य : प्राप्त का उपयोग खतरनाक माना जाता है।
मूल सुविधा पर प्रभाव : वेलिड C ++ 2011 कोड जो कि फ़ंक्शन का उपयोग करता है, इस अंतर्राष्ट्रीय मानक में संकलित करने में विफल हो सकता है।
C.4 14 और C ++ 17 के बीच संभावित असंगतताओं पर C.4 में चर्चा की गई है। चूंकि सभी गैर-मानक हेडर फाइलें C ++ 11 (जैसा कि प्रश्न में निर्दिष्ट है) में लिखी गई हैं, ये मुद्दे नहीं होंगे, इसलिए मैं यहां उनका उल्लेख नहीं करूंगा।
अब मैं लिंकर स्तर पर संगतता पर चर्चा करूंगा। सामान्य तौर पर, असंगतियों के संभावित कारणों में निम्नलिखित शामिल हैं:
यदि परिणामी ऑब्जेक्ट फ़ाइल का प्रारूप लक्ष्य C ++ मानक पर निर्भर करता है, तो लिंकर को विभिन्न ऑब्जेक्ट फ़ाइलों को लिंक करने में सक्षम होना चाहिए। जीसीसी, एलएलवीएम और वीसी ++ में, यह सौभाग्य से मामला नहीं है। यही है, ऑब्जेक्ट फ़ाइलों का प्रारूप लक्ष्य मानक के समान है, हालांकि यह संकलक पर अत्यधिक निर्भर है। वास्तव में, जीसीसी, एलएलवीएम और वीसी ++ के लिंकर्स में से किसी को भी लक्ष्य सी ++ मानक के बारे में ज्ञान की आवश्यकता नहीं है। इसका मतलब यह भी है कि हम ऑब्जेक्ट फ़ाइलों को पहले से संकलित कर सकते हैं (स्टेटिक रूप से रनटाइम को लिंक कर रहे हैं)।
यदि प्रोग्राम स्टार्टअप रुटीन (फ़ंक्शन जो कॉल करता है main
) विभिन्न C ++ मानकों के लिए अलग है और विभिन्न रूटीन एक दूसरे के साथ संगत नहीं हैं, तो ऑब्जेक्ट फ़ाइलों को लिंक करना संभव नहीं होगा। जीसीसी, एलएलवीएम और वीसी ++ में, यह सौभाग्य से मामला नहीं है। इसके अलावा, main
फ़ंक्शन के हस्ताक्षर (और उस पर लागू प्रतिबंध, मानक की धारा 3.6 देखें) सभी C ++ मानकों में समान है, इसलिए यह कोई फर्क नहीं पड़ता कि यह अनुवाद इकाई किसमें मौजूद है।
सामान्य तौर पर, WPO विभिन्न C ++ मानकों का उपयोग करके संकलित ऑब्जेक्ट फ़ाइलों के साथ अच्छी तरह से काम नहीं कर सकता है। यह बिल्कुल इस बात पर निर्भर करता है कि संकलक के किन चरणों के लिए लक्ष्य मानक के ज्ञान की आवश्यकता होती है और कौन सी अवस्थाएँ नहीं होती हैं और इसका प्रभाव उस अंतर-प्रक्रियात्मक अनुकूलन पर पड़ता है जो ऑब्जेक्ट फ़ाइलों को पार करता है। सौभाग्य से, जीसीसी, एलएलवीएम, और वीसी ++ अच्छी तरह से डिज़ाइन किए गए हैं और इस मुद्दे पर नहीं हैं (ऐसा नहीं है कि मुझे पता है)।
इसलिए, CCC मानक के विभिन्न संस्करणों में बाइनरी संगतता को सक्षम करने के लिए GCC, LLVM, और VC ++ को डिज़ाइन किया गया है । यह वास्तव में मानक स्वयं की आवश्यकता नहीं है, हालांकि।
वैसे, हालांकि वीसी ++ संकलक एसटीडी स्विच प्रदान करता है , जो आपको सी ++ मानक के एक विशेष संस्करण को लक्षित करने में सक्षम बनाता है, यह सी ++ 11 को लक्षित करने का समर्थन नहीं करता है। निर्दिष्ट किया जा सकता न्यूनतम संस्करण C ++ 14 है, जो Visual C ++ 2013 अपडेट 3 से शुरू होने वाला डिफ़ॉल्ट है। आप C ++ 11 को लक्षित करने के लिए VC ++ के पुराने संस्करण का उपयोग कर सकते हैं, लेकिन तब आपको विभिन्न VC ++ कंपाइलर का उपयोग करना होगा विभिन्न अनुवाद इकाइयों को संकलित करने के लिए जो C ++ मानक के विभिन्न संस्करणों को लक्षित करते हैं, जो बहुत कम से कम डब्ल्यूपीओ को तोड़ते हैं।
गुफा: मेरा उत्तर पूर्ण या बहुत सटीक नहीं हो सकता है।