2012-04-10 3 views
6

C++은 많은 경우에 내 보낸 인터페이스를 암호로 만들어주는 객체 지향적 인 맛을 잃어버린 C 스타일을 내보내고 가져 오는 기능 (클래스/인터페이스가없는 경우)을 많이 사용합니다.프로그래밍 : 구성 요소 경계의 인터페이스

프로그래밍 언어를 사용하여 개체 지향 스타일로 인터페이스를 내보낼 수 있습니다. D 인터페이스로 C++ (순수) 클래스를 래핑 할 수 있습니까? 고려해야 할 요소는 무엇입니까? 이 접근법이 실현 가능한가?

답변

5

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에게 알릴 수 없습니다.

관련 문제