2008-10-13 11 views
84

में सी ++ लाइब्रेरी का उपयोग करना मेरे पास एक सी ++ लाइब्रेरी है जो डेटा के प्रबंधन के लिए विभिन्न कक्षाएं प्रदान करती है। मेरे पास पुस्तकालय के लिए स्रोत कोड है।सी कोड

मैं सी फ़ंक्शन कॉल का समर्थन करने के लिए सी ++ एपीआई का विस्तार करना चाहता हूं ताकि पुस्तकालय को सी कोड और सी ++ कोड के साथ एक ही समय में उपयोग किया जा सके।

मैं जीएनयू उपकरण श्रृंखला (जीसीसी, ग्लिबैक इत्यादि) का उपयोग कर रहा हूं, इसलिए भाषा और वास्तुकला समर्थन कोई मुद्दा नहीं है।

क्या कोई कारण हैं कि यह तकनीकी रूप से संभव नहीं है?

क्या कोई गोटाचा है जिसे मुझे देखने की आवश्यकता है?

क्या इसके बारे में संसाधन, उदाहरण कोड और/या दस्तावेज उपलब्ध हैं? अपने सी ++ हेडर सी कोड द्वारा इस्तेमाल किया जा करने की जरूरत है कि रैप करने के लिए निम्नलिखित

  1. उपयोग:


    कुछ अन्य चीजें हैं जो मुझे पता चला है।

#ifdef __cplusplus 
extern "C" { 
#endif 
// 
// Code goes here ... 
// 
#ifdef __cplusplus 
} // extern "C" 
#endif 
  1. रखें अलग हेडर फाइल में 'असली' सी ++ इंटरफेस है कि सी से शामिल नहीं हैं PIMPL principle यहाँ सोचो। #ifndef __cplusplus #error सामग्री का उपयोग करके किसी भी पागलपन का पता लगाने में मदद मिलती है।
  2. सी कोड
  3. में नाम के रूप में सी ++ पहचानकर्ताओं की सावधानी बरतें सी और सी ++ कंपाइलर्स के बीच आकार में भिन्नताएं। यदि आप जीएनयू उपकरण श्रृंखला का उपयोग कर रहे हैं तो शायद कोई समस्या नहीं है, लेकिन फिर भी, सावधान रहें।
  4. structs के लिए निम्नलिखित फॉर्म का पालन करें ताकि सी उलझन में न हो।

    typedef struct X { ... } X 
    
  5. फिर चारों ओर सी ++ वस्तुओं पारित करने के लिए संकेत का उपयोग, वे तो बस जहां एक्स सी ++ वस्तु है struct एक्स के रूप में सी में घोषित किया जाना है।

यह सब एक दोस्त की सौजन्य है जो सी ++ पर एक जादूगर है।

+3

कुछ हद तक देर हो चुकी है, लेकिन मैं सी ++ के लिए सी आवरण के बारे में एक छोटे से howto लिखा है: http://www.teddy.ch/c++_library_in_c/ – Teddy

उत्तर

62

हां, यह निश्चित रूप से संभव है। आप extern "C" साथ सी में एक इंटरफेस परत ++ कि कार्यों की घोषणा लिखने के लिए की आवश्यकता होगी:

extern "C" int foo(char *bar) 
{ 
    return realFoo(std::string(bar)); 
} 

फिर, आप अपने सी मॉड्यूल है, जो realFoo() समारोह जो C++ कार्यान्वित किया जाता है के लिए पर कॉल पारित करेंगे से foo() कॉल करेंगे।

यदि आपको डेटा सदस्यों और विधियों के साथ एक पूर्ण सी ++ कक्षा का पर्दाफाश करने की आवश्यकता है, तो आपको इस सरल कार्य उदाहरण से अधिक काम करने की आवश्यकता हो सकती है।

+0

'extern" सी "' घोषणाओं में केवल रखा जाना चाहिए (और परिभाषाओं में नहीं)? क्योंकि आपने "परत जो फ़ंक्शन घोषित करती है" का उल्लेख किया है लेकिन आपका नमूना कोड भी एक परिभाषा है। दूसरे शब्दों में, क्या हमें इसे हेडर फाइलों या स्रोत फ़ाइलों में रखना चाहिए? (या दोनों?) – KyrSt

+0

@KyrSt: यदि आपके पास फ़ंक्शन घोषणा के साथ हेडर फ़ाइल है, तो आपको कम से कम 'बाहरी "सी' 'रखना होगा । आपका कंपाइलर आपको बताएगा कि आपको इसे परिभाषा पर रखना होगा या नहीं। –

3

आप सी/सी ++ कोड मिश्रण कर सकते हैं।आपका मुख्य() सी ++ में में समारोह है, तो आप सिर्फ यह सुनिश्चित करने की जरूरत है अपने ग कार्यों

extern "C" 

घोषित रहे हैं, तो आपका मुख्य सी है, तो आप शायद स्थैतिक चर के अलावा ठीक हैं। आपके स्थिर चर वाले किसी भी निर्माता को मुख्य() प्रारंभ से पहले बुलाया जाना चाहिए। यह तब नहीं होगा यदि सी आपका मुख्य है। मेरे पास बहुत से स्थिर चर हैं, सबसे अच्छा काम सिंगलटन के साथ स्थिर चर को प्रतिस्थापित करना है।

11

मुख्य गोचा: अपवादों को सी में नहीं पकड़ा जा सकता है यदि सी ++ कोड में अपवाद बढ़ने की संभावना है, तो या तो अपना सी कोड या अपने सी ++ रैपर बहुत सावधानी से लिखें। इसके विपरीत, सी कोड (जैसे विभिन्न स्क्रिप्टिंग भाषाओं में पाया गया) में तंत्र (जैसे, लांगजंप) जैसे अपवाद को स्टैक पर सी ++ ऑब्जेक्ट्स के लिए विनाशकों को आमंत्रित करने की आवश्यकता नहीं है।

+2

लांगजंप कॉल के बारे में महान बिंदु। जबकि मैं उन्हें सीधे उपयोग नहीं करता हूं, परीक्षण फ्रेमवर्क जो मैं उपयोग करता हूं उन्हें लागू करता है। कुछ ध्यान में रखना है। धन्यवाद –

18

सी ++ एफएक्यू लाइट: "How to mix C and C++ code"

कुछ gotchas इन सवालों के जवाब में वर्णित हैं:

  • [32.8] मैं एक सी समारोह से एक सी ++ के लिए/वर्ग की एक वस्तु कैसे पारित कर सकते हैं?
  • [32.9] क्या मेरा सी फ़ंक्शन सीधे सी ++ कक्षा के किसी ऑब्जेक्ट में डेटा तक पहुंच सकता है?