आप डी के सी ++ इंटरऑपरेबिलिटी स्पेक्ट्रम 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++)
घोषणा का नाम क्या है, डी को सीमित करने के लिए केवल वैश्विक नामस्थान में सी ++ प्रतीकों से लिंक करने में सक्षम होना है।
स्रोत
2012-04-10 07:20:38