使用C代码中的D类

时间:2014-04-11 12:51:03

标签: c class bison d

所以,这就是我想要做的。

有关如何实现这一目标的任何想法?

假设我们有这个:

class someClass
{
     string someVar;

     this(string v)
     {
          someVar=v;
     }

     void print()
     {
          writeln(someVar);
     }
}

在D中,我们可以做类似的事情:

someClass cl = new someClass("value");
cl.print();

我们如何在C代码中使用someClass


PS 如果你想知道我在做什么......我现在正在D中使用Flex / Bison写一个翻译,所以我需要一种方法在Bison解析代码中连接我的D对象......

2 个答案:

答案 0 :(得分:4)

您需要在D中编写函数,这些函数使用指向不透明类型的指针,并使用C调用约定导出它们。见http://dlang.org/interfaceToC.html。你需要注意垃圾收集等等。这是一种痛苦。

出于您的目的,我建议您查看特定于D的解析器生成器,而不是使用Bison。它们通常基于编译时元编程,因此您不需要单独的构建步骤,这是一个额外的加分。

您也可以用C语言编写解析器,输出C结构,然后将这些C结构转换为D中的D结构。这似乎更容易,因为D使得使用C API变得容易,反之则不然。

答案 1 :(得分:4)

class SomeClass
{
     string someVar;

     this(string v)
     {
          someVar=v;
     }

     void print()
     {
          writeln(someVar);
     }
}

extern(C) void* newSomeClass(char *v) {
    return cast(void*)(new SomeClass(to!string(v))); // \0 terminated
}

extern(C) void SomeClass_print(SomeClass cls) {
    cls.print();
}

我认为你明白了,你必须为你班级的每一种方法制作一个extern(C)函数。您可以自动生成该代码(非常简单)。 还有一些与GC有关的问题,但没有什么是你可以处理的,但这有点痛苦。