2312d,d语言调用C++的类

域用法

import core.stdc.stdio;
import example1;
extern(C):
void main()
{
    scope Foo1 f=new Foo1();
    //D语言在`betterC`下
    //可以类似C++栈上构造并析构!
    f.foo();
    f.bar(42);
}

/*输出:
|| Foo1::Foo1()
|| Foo1::foo()
|| Foo1::bar(42)
|| Foo1::~Foo1()
 */

编译命令:dmd -betterC -i main.d *.obj,输出见上面的注释.
example1.cpp内容为:

class Foo1
{
public:
    Foo1() { std::cout << "Foo1::Foo1()" << std::endl; }
    ~Foo1() { std::cout << "Foo1::~Foo1()" << std::endl; }

    Foo1(const Foo1 &) = delete;
    Foo1(Foo1 &&) = delete;

    void foo() { std::cout << "Foo1::foo()" << std::endl; }
    void bar(int64_t i) { std::cout << "Foo1::bar(" << i << ")" << std::endl; }
};

绑定的原理
编译llvm与clang
example1.d,是用polybuild借助polyglot-cpp构建的.内容如下:

module example1;
@nogc:extern(C++):
class Foo1
{
public:
    pragma(mangle, "??0Foo1@@QAE@XZ") this();
    pragma(mangle, "??1Foo1@@QAE@XZ") ~this();

    final void foo();
    final void bar(long i);
}

然后用F9msvc生成example1.obj.然后上面dmd命令就链接起来了.
所有编译型(C++,d,rust)语言的代码,在obj层面是一致的,因而可以通过链接器链接起来再运行!

你可能感兴趣的:(c++,dlang,d,c++,d)