2009-06-29 14 views
7

सी से सी ++ वस्तुओं के साथ सीधे काम करने का कोई आसान तरीका है? मैं कुछ कक्षाओं को सी ++ से सी या एफएफआई (विदेशी फ़ंक्शन इंटरफ़ेस) से बेनकाब करना चाहता हूं। ज़रूर, मुझे लगता है कि जैसे एक सामान लिख सकते हैं:सी ++ कोड और वस्तुओं से सी?

class Foo{ 
.... 
}; 

void *make_foo(...){ 
Foo *ptr = new Foo(..) 

return static_cast<void *>(ptr); 
} 

.. 

int *foo_method1(void *fooptr, ...){ 
Foo *ptr = static_cast<Foo*>(fooptr); 
} 

लेकिन वहाँ एक सरल विधि है?

+0

क्या मैं पूछ सकता हूं कि लिस्प के साथ इसका क्या संबंध है? – Svante

+0

यह सीएफएफआई (या लिस्पी कार्यान्वयन निर्भर एफएफआई) हालांकि सामान्य लिस्प में सी ++ कक्षाओं को उजागर करने के एक और सामान्य प्रश्न का हिस्सा है। –

उत्तर

8

कि, सामान्यतः, सबसे सरल तरीका है।

याद रखें, आपको भी अपने सभी सी "रैपर" विधियों पर extern "C" का उपयोग करने की आवश्यकता होगी।

7

आप लगभग वहां हैं। C++ कंपाइलर के name mangling को बंद करने के लिए extern "C" के साथ अपने स्टैंडअलोन फ़ंक्शंस को उपसर्ग करें।

उदाहरण के लिए:

extern "C" void *make_foo(...){ 
    Foo *ptr = new Foo(..) 

    return static_cast<void *>(ptr); 
} 
1

वास्तव में यह करने के लिए एक सरल तरीका नहीं है। आप उपयोगकर्ता परिभाषित प्रकारों के साथ किसी अन्य भाषा पर जाने के लिए SWIG का उपयोग कर सकते हैं जो डेटा के योग से अधिक हैं, लेकिन सी में कनवर्ट करना आपको ऑब्जेक्ट्स के सी के विचार का उपयोग करना होगा।

1

आप Verrazano/Fetter का उपयोग CFFI सी ++ कोड के लिए बाइंडिंग उत्पन्न करने के लिए कर सकते हैं। लेकिन इसके लिए जीसीसी-एक्सएमएल की आवश्यकता है और मुझे इसकी पोर्टेबिलिटी के बारे में निश्चित नहीं है।

1

यदि यह संभव है, तो अपने वर्गों को एक संरचना से प्राप्त करें। इसके बाद आप सी कोड में इस struct की ओर इशारा उपयोग कर सकते हैं:

// C++ code 
extern "C" struct Cfoo {}; 
extern "C" struct Cbar {}; 

class foo : public Cfoo {}; 
class bar : public Cbar {}; 

// C API 
extern "C" { 
    struct Cfoo; 
    struct Cbar; 
} 

यह नहीं कड़ाई से एक त्रुटि तथापि जीसीसी कम से कम विभिन्न प्रकार के साथ संकेत के बीच परिवर्तित करने के बारे में चेतावनी दी है है,।

void foo (void) { 
    struct Cfoo * pf; 
    struct Cbar * pb; 
    pf = pb;  // gcc warns 
} 

आप वारिस नहीं कर सकते, तो एक समान विचार का उपयोग लेकिन सी संरचना दुकान सी ++ वस्तु के लिए एक सूचक है, और फिर बस आगे सी एपीआई में संरचनाओं की घोषणा:

// C++ code 
class foo {}; 
class bar {}; 

extern "C" struct Cfoo { foo * pFoo; }; 
extern "C" struct Cbar { bar * pBar; }; 

// C API 
extern "C" { 
    struct Cfoo; 
    struct Cbar; 
} 

यहां नुकसान यह है कि सीएफयू और सीबर ऑब्जेक्ट के जीवनकाल की देखभाल की जानी चाहिए।