2010-09-14 22 views

उत्तर

2

सी ++ बाह्य "सी" घोषणाओं द्वारा सी के साथ अंतःक्रिया कर सकता है।

7

बूस्ट। पायथन में विशेष मैक्रोज़ हैं जो extern "C" के साथ फ़ंक्शन घोषित करते हैं ताकि पायथन दुभाषिया उन्हें कॉल कर सके। यह जटिल है, लेकिन आप अधिक जानकारी के लिए Boost documentation देख सकते हैं।

4

पायथन एक सी-एपीआई घोषित करता है (http://docs.python.org/2/c-api/ या http://docs.python.org/3/c-api/ देखें)। यह एपीआई एक सामान्य ऑब्जेक्ट प्रकार को परिभाषित करता है जिसे PyObject कहा जाता है जो कि केवल एक सामान्य सी संरचना है। यह संरचना एक पाइथन ऑब्जेक्ट सब कुछ (लगभग) परिभाषित करती है, उदाहरण के लिए, इस ऑब्जेक्ट पर जोड़ या तुलना करते समय क्या होता है या बस इसे फ़ंक्शन की तरह कॉल करें।

क्योंकि पाइथन प्रकार भी ऑब्जेक्ट्स हैं (और इसलिए PyObject संरचना द्वारा सी में प्रतिनिधित्व किया जाता है), एक नया प्रकार परिभाषित करना एक नया PyObject संरचना को परिभाषित करने का एक साधारण मामला है। जब पाइथन में विधियों को बुलाया जाता है, तो दुभाषिया इस संरचना से जुड़े सी कार्यों को कॉल करता है।

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

मुझे उम्मीद है कि यह कुछ हद तक स्पष्ट है कि पाइथन दुभाषिया उपर्युक्त से संकलित एक्सटेंशन से सामान कहता है। एकमात्र लापता अंतर यह है कि सी-एपीआई सी ++ कोड कैसे कॉल करता है।

बूस्ट। पाइथन इस तरह के कोड के साथ कोड में सी प्रविष्टि बिंदु घोषित करके करता है जैसा कि यहां बताया गया है: Elegantly call C++ from C। हर बार जब आप कॉल करते हैं, उदाहरण के लिए, boost::python::class_, यह आपके द्वारा पाइथन की घोषणा के प्रकार के लिए करता है, इसलिए PyObject बनाता है जो आपके द्वारा चुने गए नाम के साथ आपकी कक्षा का प्रतिनिधित्व करता है। जैसा कि आप इस कक्षा में .def पर कॉल करते हैं, आप उस संरचना के आंतरिक स्लॉट भरते हैं, और अधिक विधियों, ऑपरेटरों और आपके नए प्रकार के गुणों को घोषित करते हैं। इनमें से प्रत्येक आंतरिक स्लॉट एक सी-स्टाइल फ़ंक्शन को इंगित करता है जो बराबर सी ++ कॉल के लिए एक रैपर नहीं है।

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