2009-08-05 7 views
6

के बजाय C++ में प्लगइन इंटरफ़ेस क्यों सेट करना चाहिए, मेरे previousquestions के परिणामस्वरूप मैंने खुद से पूछा: क्या प्लगइन सिस्टम के लिए सी ++ इंटरफेस स्थापित करने के लिए यह उपयोगी है? निम्नलिखित बातों पर इसके खिलाफ बोल रहे हैं:मुझे

  • विभिन्न compilers और उनके संस्करणों के बीच कोई आम ABI, स्मृति
  • कोई प्रत्यक्ष वर्ग निर्यात में वस्तुओं की कोई आम लेआउट। आपको कारखानों और विनाशकों को निर्यात करना होगा। समस्याएं उत्पन्न होती हैं यदि आपकी ऑब्जेक्ट्स अन्य ऑब्जेक्ट्स द्वारा आयोजित की जाती हैं जो केवल delete हैं, उदाहरण के लिए स्मार्ट पॉइंटर्स।
  • एसटीएल के विभिन्न कार्यान्वयन, आप बूस्ट

की तरह इस्तेमाल किया पुस्तकालयों के

  • विभिन्न संस्करणों प्लगइन करने के लिए एक std::list<T> पारित नहीं कर सकते हैं सी ++ भाषा आप लगभग अंत के शेष भागों के लिए अपने आप को नियंत्रित करते हैं "सी सबसेट" के साथ। क्या सी ++ का उपयोग करने के लिए कोई अंक बोल रहा है? क्यूटी-टूलकिट उल्लिखित समस्याओं को कैसे हल करता है?

    टिप्पणी: मैं ज्यादातर लिनक्स सिस्टम का जिक्र कर रहा हूं। फिर भी मैं अन्य प्लेटफॉर्म पर समाधान में रूचि रखता हूं।

    अतिरिक्त प्रश्न: सी इंटरफ़ेस का उपयोग करने में समस्याएं क्या हैं? struct एस का मेमोरी लेआउट? सी के कौन से भाषा भागों से बचा जाना चाहिए?

  • +1

    सी मानक या तो एबीआई निर्दिष्ट नहीं करता है। असल में, जिन मुद्दों के बारे में आप शिकायत करते हैं, वे सी ++ के बराबर सी पर लागू हो सकते हैं। –

    +0

    हां, यह ध्यान देने योग्य है कि मानक आमतौर पर ओएस द्वारा निर्धारित किया जाता है, और इसके सी कंपाइलर्स के साथ क्या करने के लिए कुछ भी नहीं हो सकता है या नहीं। विंडोज़ पर यह stdcall है। –

    +0

    @Neil। सी मानक एक अच्छी तरह से परिभाषित एबीआई है। यही कारण है कि सी कई अन्य भाषाओं के बीच ग्लू है। –

    उत्तर

    6

    हालांकि इस बारे में और अधिक है "कैसे" से "क्यों", आप (not yet)Boost.Extension पुस्तकालय में रुचि हो सकती रूप author's blog रूप में अच्छी तरह, विषय पर।

    "क्यों" भाग के लिए, मेरी 2 (कनाडा) सेंट: यह दर्शकों पर निर्भर करता है (प्लगइन लेखकों) और अपने आवेदन और उसके प्लगइन्स के बीच इंटरफेस की समृद्धि पर:

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

    हालांकि, पहली कसौटी (दर्शकों) अधिक महत्वपूर्ण है, और एक सी ++ इंटरफेस इस प्रकार समझ में आता है केवल अगर दर्शकों सजातीय है और इंटरफेस काफी अभिव्यक्ति लाभ से लाभ।

    +1

    मैं पहली बुलेट से सहमत हूं। हालांकि, ऐसी परिस्थितियां जहां दर्शकों को छोटा, सजातीय और लागू करने के लिए पर्याप्त नियंत्रण में एक ही निष्पादन योग्य पर विकास के बाहर काफी दुर्लभ होने जा रहे हैं। –

    +0

    @ टी.ई.डी .: "एक निष्पादन योग्य पर विकास" द्वारा, क्या आपका मतलब है "प्लगइन जो एक निष्पादन योग्य के साथ काम करते हैं" या "एक, सिंगल, मोनोलिथिक निष्पादन योग्य बिना किसी प्लगइन के"? –

    +0

    मैं ज्यादातर बाद वाले लोगों के बारे में सोच रहा था, लेकिन पूर्व शायद सी ++ रैपर विचार के लिए –

    0

    मुझे लगता है कि आप वहां अपने स्वयं के प्रश्न का उत्तर दे रहे हैं। एक सरल सी प्लगइन इंटरफ़ेस को लागू करने और प्लगइन लेखकों को उनकी प्लगइन को C++ के साथ लागू करने की अनुमति देने के लिए कुछ भी नहीं है। बस कोशिश करते हैं और नेटस्केप प्लगइन एपीआई द्वारा की गई गलतियों से सीख है ...

    +1

    मुझे नेटस्केप प्लगइन एपीआई द्वारा बनाई गई गलतियों के बारे में कुछ जानकारी कहां मिल सकती है? " – phlipsy

    +0

    "नेटस्केप प्लगइन एपीआई द्वारा बनाई गई गलतियों" के बारे में कोई भी लिंक? – augustin

    1

    आम तौर पर कुछ इंटरफेस मानक पर इंटरफेस लिखना एक स्मार्ट विचार है जिसे गिना जा सकता है। यही कारण है कि हर ओएस इतना इंटरफ़ेस प्रदान करता है। अधिकांश यूनिक्स पर सी कंपाइलर ओएस के समान सम्मेलन का उपयोग करते हैं, इसलिए वे इसे सी कॉलिंग सम्मेलन कहते हैं। इस उद्देश्य के लिए विंडोज़ stdcall है।

    यदि आप कुछ संकलक-आंतरिक कॉलिंग इंटरफ़ेस का उपयोग करने का प्रयास करते हैं, जैसे सी ++, तो आप अपने द्वारा उल्लिखित सभी समस्याओं का शिकार हो जाएंगे। यहां तक ​​कि कंपाइलर अपडेट भी आपको नली के लिए उत्तरदायी हैं।

    4

    मैंने एक बार सिस्टम विकसित करने के लिए प्लगइन इंटरफेस में सी ++ बनाया और यह एक बड़ी गलती थी। व्यवहार्य, लेकिन व्यावहारिक नहीं है। आज, मैं हमेशा इंटरफ़ेस को सी में पूरी तरह से बनाना चाहता हूं, और जितना सरल हो सकता हूं। इन विकल्पों के लाभ वास्तव में महत्वपूर्ण हैं। और यदि आपके प्लगइन लेखक एक सी ++ एपीआई चाहते हैं, तो आप सी सी ++ रैपर लिख सकते हैं जो सी इंटरफ़ेस को कॉल करता है।

    एक अतिरिक्त बोनस के रूप में, यदि आपके प्लगइन लेखक किसी अन्य भाषा में एपीआई चाहते हैं, तो सी सी एपीआई हमेशा बाइंडिंग बनाने के लिए आसान होगा।

    +0

    +1 योग्य होगा। – phlipsy