2012-04-10 9 views
6

सी ++ सी शैली पर कार्यों को निर्यात और आयात करने के लिए भारी रूप से निर्भर करता है (वर्गों/इंटरफ़ेस में कोई नहीं था) इस प्रकार ऑब्जेक्ट उन्मुख स्वाद को खो देता है जो कई तरीकों से निर्यातित इंटरफ़ेस को गुप्त बनाता है।डी प्रोग्रामिंग: घटक सीमाओं पर इंटरफ़ेस

क्या डी प्रोग्रामिंग भाषा ऑब्जेक्ट उन्मुख शैली में इंटरफेस निर्यात करने के लिए उपयोग की जा सकती है। क्या मैं डी इंटरफेस के साथ सी ++ (शुद्ध) कक्षाएं लपेट सकता हूं? विचार करने के लिए संभावित तत्व क्या हैं? क्या यह दृष्टिकोण व्यवहार्य है।

उत्तर

5

आप डी के सी ++ इंटरऑपरेबिलिटी स्पेक्ट्रम here पर एक सिंहावलोकन पा सकते हैं।

वस्तु उन्मुख शैली अंतर D के interface निर्माण के माध्यम से प्रदान की जाती है:

सी ++ पक्ष

#include<iostream> 

class I // Our interface-by-convention 
{ 
public: 
    virtual void foo() = 0; 

    void bar() // OK, non-virtual members do not affect binary compatibility 
    { 
     /* ... */ 
    } 
}; 

class C : public I 
{ 
private: 
    int a; 

public: 
    C(int a) : a(a) {} 

    void foo() 
    { 
     std::cout << a << std::endl; 
    } 
}; 

// This function will be used from the D side 
I* createC(int a) 
{ 
    return new C(a); 
} 

डी ओर

extern(C++) interface I 
{ 
    void foo(); 

    final void bar() // OK, non-virtual members do not affect binary compatibility 
    { 
     /+ ... +/ 
    } 
} 

// Link `createC` from the C++ side 
extern(C++) I createC(int a); 

void main() 
{ 
    I i = createC(2); 
    i.foo(); // Write '2' to stdout 
} 

D के extern(C++) इंटरफ़ेस I को दोहराने के लिए इंटरफ़ेस लेआउट का कारण बनता है पर टी में आभासी कार्यों के साथ एकल विरासत सी ++ वर्ग का लेआउट वह साथी सी ++ संकलक।

फ़ंक्शन घोषणा पर एक ही विशेषता createC फ़ंक्शन को मैंगलिंग को दोहराने और साथी सी ++ कंपाइलर में समकक्ष फ़ंक्शन के सम्मेलन को कॉल करने का कारण बनती है।

कंपैनियन कंपाइलर जोड़े: डीएमडी/डीएमसी ++, जीडीसी/जी ++, एलडीसी/क्लैंग। वर्चुअल फ़ंक्शंस और सी एबीआई को सीधे फ़ंक्शन कॉल के लिए चिपके हुए गैर-साथी कंपाइलर के साथ इंटरऑपरेट करना अक्सर संभव होता है।

नोट createC समारोह सी में I* रिटर्न कि ++ और सिर्फ I डी में इसका कारण यह है डी अंतरफलक और वर्गों प्रकार संदर्भ परोक्ष कर रहे हैं।

अधिक विशिष्ट वास्तविक दुनिया उपयोग में, createC समारोह सीधी-सपाट जब DLLs का उपयोग कर जोड़ने क्रम अधिक (सी ++ तरफ और फिर extern "C") extern(C++)extern(C) से हो सकता है, compilers के बीच अधिक से अधिक अंतर के लिए या होने की संभावना है, और अधिक है।

extern(C++) वर्तमान में कुछ सीमाएं हैं; वर्तमान में डी को यह बताने के लिए संभव नहीं है कि extern(C++) घोषणा का नाम क्या है, डी को सीमित करने के लिए केवल वैश्विक नामस्थान में सी ++ प्रतीकों से लिंक करने में सक्षम होना है।

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