所以,这就是我想要做的。
有关如何实现这一目标的任何想法?
假设我们有这个:
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对象......
答案 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有关的问题,但没有什么是你可以处理的,但这有点痛苦。