यह हाथ से करना बहुत कठिन नहीं है, लेकिन यह आपके इंटरफ़ेस के आकार पर निर्भर करेगा। जिन मामलों में मैंने यह किया है वे शुद्ध सी कोड के भीतर से हमारी सी ++ लाइब्रेरी के उपयोग को सक्षम करने के लिए थे, और इस तरह एसडब्ल्यूआईजी को बहुत मदद नहीं मिली। (वैसे शायद SWIG का उपयोग यह करने के लिए किया जा सकता है, लेकिन मैं कोई SWIG गुरु नहीं हूँ और यह गैर-तुच्छ लग रहा था)
हम सब समाप्त कर रहे थे:
- हर वस्तु सी के बारे में एक अपारदर्शी संभाल में पारित किया है।
- कंस्ट्रक्टर और डिस्ट्रक्टर्स शुद्ध कार्यों में लिपटे हुए हैं
- सदस्य कार्य शुद्ध कार्य हैं।
- अन्य बिल्डरों को सी समकक्षों के लिए मैप किया जाता है जहां संभव हो।
तो इस तरह एक वर्ग (C ++ हैडर)
class MyClass
{
public:
explicit MyClass( std::string & s );
~MyClass();
int doSomething( int j );
}
इस तरह (सी हैडर) के लिए एक सी इंटरफेस का नक्शा होगा:
struct HMyClass;
typedef struct HMyClass HMyClass;
HMyClass * myStruct_create( const char * s );
void myStruct_destroy( HMyClass * v );
int myStruct_doSomething( HMyClass * v, int i );
इंटरफ़ेस का कार्यान्वयन इस तरह दिखाई देगा (C ++ स्रोत)
#include "MyClass.h"
extern "C"
{
HMyClass * myStruct_create( const char * s )
{
return reinterpret_cast<HMyClass*>( new MyClass( s ) );
}
void myStruct_destroy( HMyClass * v )
{
delete reinterpret_cast<MyClass*>(v);
}
int myStruct_doSomething( HMyClass * v, int i )
{
return reinterpret_cast<MyClass*>(v)->doSomething(i);
}
}
हम किसी भी कास्टिंग की आवश्यकता से बचने के लिए मूल श्रेणी से अपने अपारदर्शी हैंडल को प्राप्त करते हैं, और (यह मेरी वर्तमान योग्यता के साथ काम नहीं करता था)। हमें हैंडल को एक स्ट्रक्चर बनाना होगा क्योंकि C क्लास को सपोर्ट नहीं करता है।
तो यह हमें मूल C इंटरफ़ेस देता है। यदि आप एक और पूर्ण उदाहरण दिखाना चाहते हैं, जिसमें आप अपवाद हैंडलिंग को एकीकृत कर सकते हैं, तो आप मेरे कोड को github पर आज़मा सकते हैं: https://gist.github.com/mikeando/5394166
मज़ेदार हिस्सा अब यह सुनिश्चित कर रहा है कि आपको सभी आवश्यक C ++ लाइब्रेरीज़ आपको बड़ी लाइब्रेरी में सही तरीके से जुड़ी हुई मिलें। जीसीसी (या क्लैंग) के लिए इसका मतलब है कि सिर्फ जी ++ का उपयोग करके अंतिम लिंक चरण करना।