2009-09-29 6 views
6

में आरटीटीआई झंडे को मिलाकर यदि मेरे पास सी ++ में कई जुड़े सी ++ स्टेटिक लिंक्ड लाइब्रेरी हैं, तो क्या उनके लिए क्लास ऑब्जेक्ट्स (पास से और फ़ंक्शंस से) साझा करना संभव है यदि उन्हें सक्षम/अक्षम रन टाइम के अलग-अलग मानों के साथ संकलित किया गया हो प्रकार की जानकारी (आरटीटीआई)?सी ++

--edit: प्रतिक्रियाओं के लिए धन्यवाद, विशिष्ट चीजें जिन्हें मैं चिंतित था 1. आरटीटीआई को स्थिर (गैर बहुलक प्रकार) के आकार के व्यवहार को बदलने में सक्षम बनाता है?

और 2. यदि मैं एक आरटीटीआई सक्षम लाइब्रेरी में एक कक्षा बनाता हूं और इसे किसी अन्य गैर आरटीटीआई सक्षम पुस्तकालय में भेजता हूं, तो वर्चुअल विधियां ठीक से काम करती हैं। (और इसके विपरीत)

और अंत में 3. अगर मैं एक RTTI सक्षम पुस्तकालय में एक वर्ग बनाने के लिए, मैं इसके साथ dynamic_cast उपयोग करने के लिए, अगर मैं एक गैर RTTI सक्षम पुस्तकालय के लिए उस वस्तु पारित सक्षम होने की अपेक्षा कर सकते हैं मैं अभी भी पर ऑब्जेक्ट पर इसका उपयोग करता हूं। ... मैं नहीं मानूंगा, और ऐसा लगता है कि यह एक बुरा विचार है ... मैं सिर्फ उत्सुक हूँ।

उत्तर

6

आरटीटीआई जानकारी कैसे संग्रहीत की जाती है एक कार्यान्वयन विवरण है और इस प्रकार विभिन्न कंपाइलरों में पोर्टेबल नहीं है।

इसके अलावा अधिकांश कंपाइलर्स यह भी गारंटी नहीं देते हैं कि अलग-अलग झंडे से संकलित ऑब्जेक्ट्स उसी एबीआई का उपयोग विधियों के लिए करेंगे। यह सबसे प्रमुख रूप से रिलीज और डीबग पुस्तकालयों के साथ दिखाया गया है लेकिन अन्य झंडे भी मतभेद पैदा कर सकते हैं।

न केवल एबीआई कार्यों/विधियों के लिए बदल सकता है, लेकिन झंडे संरचनाओं में तत्वों के बीच कंपाइलर द्वारा उपयोग किए गए पैडिंग को प्रभावित कर सकते हैं, इस प्रकार विभिन्न झंडे के साथ संकलित होने पर भी वर्चुअल विधियों के बिना ऑब्जेक्ट असंगत हो सकते हैं।

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

+0

उत्कृष्ट अंक जिन्हें कोई अन्य यहां नहीं सोचा, विशेष रूप से संकलक सेटिंग्स के आधार पर पैडिंग के संबंध में समस्याएं। – Elemental

+0

@ लोकी अस्थारी: क्या यह इंगित करता है कि अगर मैं किसी .so या .dll (RTTI अक्षम के साथ संकलित) से किसी ऑब्जेक्ट का उपयोग करता हूं, तो मैं उस ऑब्जेक्ट के लिए dynamic_cast और टाइपिड का उपयोग नहीं कर पाऊंगा। या बदतर, एबीआई सही नहीं था इसलिए कार्यक्रम असंगत (शायद दुर्घटना, आदि) हैं। –

+0

@ शाओ-चुआनवांग: संभावित रूप से। यह सब आपके कंपाइलर पर निर्भर करता है। सुरक्षित होने के लिए सभी वस्तुओं को एक ही झंडे से संकलित किया जाना चाहिए। –

1

यह इस बात पर निर्भर करता है कि आप किस विशिष्ट सी ++ कंपाइलर के बारे में बात कर रहे हैं - मेरे पास सी ++ के साथ हाल ही में हाल ही में क्रॉस-प्लेटफार्म का अनुभव नहीं है (हाल के वर्षों में मेरा सी ++ काम लगभग विशेष रूप से लिनक्स पर सी ++ के साथ रहा है), लेकिन कुछ सालों पहले मैं शर्त लगाता था कि जीसीसी आपको इस तरह के मिसजेजनेशन, विजुअल सी ++ "नो वे", कुछ कंप्यूटर्स के बीच कुछ हद तक दूर जाने देता है ...! -

0

कक्षाओं तक साझा नहीं polymorphic (यानी, उनमें वर्चुअल फ़ंक्शन नहीं हैं), यह कोई समस्या नहीं होगी। लेकिन आप आरटीटीआई अक्षम के साथ गतिशील_कास्ट, टाइपिड और अपवादों का उपयोग करने में सक्षम नहीं होंगे।

+0

विभिन्न झंडे संरचनाओं में पैडिंग को अलग करने का कारण बन सकते हैं जिससे वस्तुओं को पुस्तकालयों में असंगत बना दिया जाता है। –