首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >D编程:组件边界的接口

D编程:组件边界的接口
EN

Stack Overflow用户
提问于 2012-04-10 12:44:18
回答 1查看 639关注 0票数 6

C++在很大程度上依赖于C风格来导出和导入函数(如果有类/接口的话就不是了),因此失去了面向对象的风格,这在很多方面使得导出的接口变得模糊。

可以使用D编程语言以面向对象的方式导出接口吗?我能用D接口包装C++ (纯)类吗?可能要考虑的因素是什么?这种方法可行吗。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-10 15:20:39

您可以在D的C++互操作性频谱here上找到概述。

面向对象风格的互操作性是通过D的interface构造提供的:

C++端

代码语言:javascript
运行
复制
#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侧

代码语言:javascript
运行
复制
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
}

接口I上的D's extern(C++)导致接口布局在附带的C++编译器中复制具有虚函数的单继承C++类的布局。

函数声明createC上的相同属性会导致该函数复制配套的C++编译器中等效函数的损坏和调用约定。

配套的编译器对: DMD/DMC++,GDC/g++,LDC/Clang。通过坚持使用虚函数和用于直接函数调用的ABI,通常可以与非配套编译器进行互操作。

请注意,createC函数在C++中返回I*,在D中仅返回I。这是因为D接口和类都是隐式引用类型。

在更典型的实际应用中,createC函数更有可能是extern(C)而不是extern(C++) (然后在C++端使用extern "C" ),以提高编译器之间的互操作性,或者在使用DLL时提供更直接的运行时链接。

extern(C++)目前有一些限制;它目前不可能告诉D extern(C++)声明在哪个名称空间中,限制D只能链接到全局名称空间中的C++符号。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10083203

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档