2013-07-10 7 views
8

यह कानूनी एक struct एक सी structC++ आगे घोषित सी struct परिभाषित करें - <code>struct</code> यानी के रूप में एक गैर-पॉड, - struct

// api.h 
#ifdef __cplusplus 
extern "C" { 
#endif 

    typedef struct handle_tag handle_t; 

    handle_t *construct(); 
    void destruct(handle_t *h); 

    void func(handle_t *h); 

#ifdef __cplusplus 
} 
#endif 

और बाद में एक सी ++ के रूप में यह परिभाषित के रूप में आगे-घोषित करने के लिए है प्रकार?

// api.cpp 
struct handle_tag { 
    void func(); 
    std::string member; 
}; 

void func(handle_t *h) { 
    h->func(); 
} 

सामान्य इरादा एक सी इंटरफेस बाह्य रूप से सुलभ अपारदर्शी प्रकार handle_t जो आंतरिक रूप से एक सी ++ डेटा प्रकार के रूप कार्यान्वित किया जाता है के माध्यम से प्राप्त करने के लिए है।

+4

संयोग से, पीओडीनेस सी बनाम सी ++ लिंकेज से असंबंधित है। सी ++ नामों को इस बात पर ध्यान दिए बिना कि वे पीओडी हैं या नहीं। –

+0

@ कोनराड्रूडॉल्फ वह संरचना पीओडी नहीं है –

+1

@ BЈовић ठीक है, कोई भी दावा नहीं किया, नहीं? –

उत्तर

9

हां, कोई दिक्कत रूप में लंबे समय के रूप में काम करेंगे सी कोड कभी नहीं "अंदर" handle_tag संरचना को देखने के लिए की जरूरत है, और उचित सी ++ निर्माण/विनाश सी ++ कोड (जो मैं construct preseume और destruct लिए कर रहे हैं द्वारा किया जाता है)।

सी कोड की ज़रूरतों को कुछ डेटास्ट्रक्चर के लिए एक सूचक है - यह नहीं पता कि सामग्री क्या है, इसलिए कंटेंटर/विनाशक रिलायंस डेटा समेत सामग्री कुछ भी हो सकती है।

संपादित करें: मैं यह है कि, या यह करने के लिए इसी तरह के तरीकों का कहना है चाहिए (एक void * का उपयोग कर जैसे hold सी हिस्से के लिए एक वस्तु का पता दर्ज करने के लिए), एक बहुत ही आम रास्ता के लिए सी-कोड इंटरफेस करने है सी ++ कार्यक्षमता।

संपादित 2: यह महत्वपूर्ण है कि सी ++ कोड जिसे सी कोड में अपवाद "रिसाव" नहीं करता है। यह अपरिभाषित व्यवहार है, और क्रैश, या बदतर, "अजीब चीजें" जो क्रैश नहीं होता है, के कारण बहुत ज़िम्मेदार है ... इसलिए जब तक कोड अपवादों का कारण नहीं बनता है (और उदाहरण के लिए std::stringbad_alloc को फेंकने के लिए उत्तरदायी है कम स्मृति की), इसे C12+ पक्ष में construct एएनएफ func जैसे कोड के अंदर try/catch ब्लॉक का उपयोग करना आवश्यक है।

+2

क्या आप वाकई काम करते हैं? 'Api.cpp' के लिए ऑब्जेक्ट फ़ाइल 'handle_tag' के लिए एक गैर-उलझन नाम निर्यात करेगी? –

+1

@ कोनराड रुडॉल्फ: आमतौर पर केवल चर और फ़ंक्शंस स्वयं को निर्यात किए गए नाम के रूप में प्रकट करते हैं, केवल एक प्रकार के पास कोई उलझन वाला नाम नहीं होता है। – PlasmaHH

+0

जब तक आप केवल एक सूचक के रूप में निर्यात किए गए टाइप किए गए टाइप का उपयोग करते हैं, तो आपको ऐसा करने में कोई समस्या नहीं होगी।उस संरचना में सूचक के आकार को जानने के लिए सी को संरचना के आकार को जानने की आवश्यकता नहीं है। –

2

काफी काम नहीं करेगा, लेकिन अवधारणा ठीक है। जब फ़ंक्शन परिभाषित किए जाते हैं, तो आपको यह भी सुनिश्चित करना होगा कि नाम उलझन में नहीं हैं ताकि सी कोड उन्हें ढूंढ सके। इसका मतलब है कि #include "api.h" आपकी api.cpp फ़ाइल के ऊपर जोड़ा जाना चाहिए।

+0

आप सही हैं, मैंने कुछ विवरण छोड़े हैं ... – phlipsy

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