2011-03-30 5 views
5

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

यदि मैं अपने सभी प्रोटोटाइपों पर बाहरी "सी" {} लागू करता हूं, और उदाहरण के लिए क्लास फ़ंक्शंस की नकल करने वाले खुला कार्यों का एक सेट प्रदान करता हूं ताकि ऑब्जेक्ट्स मेरी लाइब्रेरी का उपयोग करने के लिए "आवश्यक" न हों, तो वे सामान्य कार्य कार्य करेंगे सी प्रोग्राम में जो इससे लिंक होगा?

+0

संभव डुप्लिकेट (http://stackoverflow.com/questions/4978330/c-library-with-c-interface) – CharlesB

उत्तर

6

यदि आप वर्णित फेशन में एक डीएल बनाते हैं, यानी, सभी इंटरफेस बाहरी "सी" हैं और इंटरफेस में सभी प्रकार पीओडी हैं तो हाँ, आपको व्यावहारिक रूप से सी या .NET

में इसका उपयोग करने में कोई समस्या नहीं होगी

उदाहरण:

class MyClass 
{ 
public: 
    MyClass(float x) {...} 
    void method(int x) {...} 
    ~MyClass() {...} 
}; 

#define MYAPI extern "C" __declspec(dllexport) //or whatever the syntax is for your compiler 

MYAPI MyClass* CreateMyClass(float x) 
{ 
    return new MyClass(x);  
} 

MYAPI void MyClass_method(MyClass* p, int x) 
{ 
    return p->method(x); 
} 

MYAPI void DestroyMyClass(MyClass* p) 
{ 
    delete p; 
} 
+4

: आप इस आम मुहावरा द्वारा ऐसा कर सकते हैं अपवादों को पकड़ना न भूलें - अपवाद "बाहरी" सी "" सीमा पार नहीं हो सकते हैं –

+0

@ लैरी: धन्यवाद। आइए इसे ओपी में छोड़ दें;) –

+0

मैं इस उदाहरण की सराहना करता हूं, मैंने डीएल के लिए इस फॉर्म के बारे में जो पढ़ा है, उससे यूनिक्स जैसी प्रणालियों के लिए साझा वस्तुओं को पोर्ट करना आसान होना चाहिए। – Alexander

3

आप अपने सी स्रोतों में शामिल करने के लिए के लिए अलग हेडर फाइल करने की आवश्यकता हो सकती है। सी हेडर में कोई सी ++ कोड नहीं होना चाहिए जो सी कंपाइलर को पार्स करने की उम्मीद की जा सकती है। वहां, आप अपने सी ++ लाइब्रेरी में सी इंटरफ़ेस प्रदान करेंगे। extern "C" संशोधक प्रदान करके, जैसा कि आप इंगित करते हैं कि आप ऐसा करेंगे, इस शीर्षलेख में फ़ंक्शन घोषणाओं के लिए आप संकलक को सी प्रोग्राम के लिए लिंक बनाने के लिए बताते हैं।

इसलिए यदि आपको किसी ऑब्जेक्ट का संदर्भ रखने के लिए सी प्रोग्राम की आवश्यकता है, तो इसे void * पॉइंटर के रूप में सी इंटरफ़ेस के माध्यम से आगे और आगे पास करें। सी में आप इसे एक जादू कुकी के रूप में देखते हैं।

अन्य पोस्ट एक डीएलएल के माध्यम से इंटरफेस को उजागर करने के लिए बोलते हैं, जो उपयोगी ज्ञान भी है लेकिन सख्ती से (मानक) भाषा पहलुओं से बात नहीं कर रहा है।

संपादित

ओ बिल्ली। extern "C" भाग सी ++ वाक्यविन्यास है। तो, सी ++ पक्ष पर आपको extern "C" के साथ सी इंटरफ़ेस फ़ंक्शंस घोषित करना होगा लेकिन सी पक्ष पर आपके पास यह वाक्यविन्यास नहीं हो सकता है।

#ifdef __cplusplus 
extern "C" { 
#endif 
void foo(); 
#ifdef __cplusplus 
} 
#endif 
[C++ सी इंटरफेस के साथ पुस्तकालय] की
+0

मैं इनपुट की सराहना करता हूं, ऐसा करने के लिए कठिन परिश्रम की तुलना में यह एक मजेदार चुनौती दिखता है। – Alexander

+1

@alexander: मैं प्रतिक्रिया की सराहना करता हूं। सौभाग्य। – gregg

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