C++은 많은 경우에 내 보낸 인터페이스를 암호로 만들어주는 객체 지향적 인 맛을 잃어버린 C 스타일을 내보내고 가져 오는 기능 (클래스/인터페이스가없는 경우)을 많이 사용합니다.프로그래밍 : 구성 요소 경계의 인터페이스
프로그래밍 언어를 사용하여 개체 지향 스타일로 인터페이스를 내보낼 수 있습니다. D 인터페이스로 C++ (순수) 클래스를 래핑 할 수 있습니까? 고려해야 할 요소는 무엇입니까? 이 접근법이 실현 가능한가?
C++은 많은 경우에 내 보낸 인터페이스를 암호로 만들어주는 객체 지향적 인 맛을 잃어버린 C 스타일을 내보내고 가져 오는 기능 (클래스/인터페이스가없는 경우)을 많이 사용합니다.프로그래밍 : 구성 요소 경계의 인터페이스
프로그래밍 언어를 사용하여 개체 지향 스타일로 인터페이스를 내보낼 수 있습니다. D 인터페이스로 C++ (순수) 클래스를 래핑 할 수 있습니까? 고려해야 할 요소는 무엇입니까? 이 접근법이 실현 가능한가?
D의 C++ 상호 운용성 범위 here에 대한 개요를 찾을 수 있습니다.
객체 지향 스타일 상호 운용성 D' S interface
구조를 통해 제공된다
C++ 측
#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);
}
D 측
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' S extern(C++)
복제 인터페이스 레이아웃을 발생 I
인터페이스에 가상 함수가있는 단일 상속 C++ 클래스의 레이아웃 그는 companion C++ 컴파일러입니다.
함수 선언 createC
의 동일한 속성은 함수가 동등한 함수의 mangling 및 calling 규칙을 companion C++ 컴파일러에서 복제하게합니다.
컴패니언 컴파일러 쌍 : DMD/DMC++, GDC/g ++, LDC/Clang. 직접 함수 호출을 위해 가상 함수와 C ABI를 사용하여 비 호환 컴파일러와 상호 운용 할 수 있습니다.
createC
함수는 C++에서 I*
을 반환하고 D에서는 I
을 반환합니다. 이는 D 인터페이스와 클래스가 암시 적으로 참조 유형이기 때문입니다. 전형적인 실제 사용시
는 createC
함수는 DLL을 사용하는 경우 링크 직선적 런타임 더 컴파일러 사이의 상호 운용성을 위해, (는 C++ 측하고 extern "C"
) extern(C)
보다 extern(C++)
될 가능성 이상이다.
extern(C++)
에는 현재 일부 제한 사항이 있습니다. 현재는 D를 glob namespace의 C++ 심볼로만 링크 할 수 있도록 D를 제한하는 extern(C++)
선언이있는 네임 스페이스를 D에게 알릴 수 없습니다.