从D语言调用C++(C)

11

如何从D程序中调用C++函数? 我应该使用哪些命令? 我正在尝试在Fedora上使用dmd


2
尝试查看http://dlang.org/interfaceToC.html,虽然它似乎只适用于C。您可以在此处查看有关如何与C ++ 接口的建议:http://dlang.org/cpp_interface.html - Yet Another Geek
我看了那个教程,它没有关于.di文件的描述。感谢Vlad与我分享解决方案。 - Stan
1个回答

15

我能想到的最简单的例子,如果你正在调用C函数:

$ cat a.c
int f(int a, int b){
    return a + b + 42;
}
$ cat a.di
extern (C):
int f(int, int);
$ cat b.d
import std.stdio;
import a;
void main(){
    writeln( f( 100, 1000) );
}
$ gcc -c a.c
$ dmd b.d a.o
$ ./b
1142
$ 

如果您正在使用共享对象,您可以像这样进行操作:

$ cat sdltest.di
module sdltest;

extern (C):

struct SDL_version{
    ubyte major;
    ubyte minor;
    ubyte patch;
}

SDL_version * SDL_Linked_Version();

$ cat a.d
import std.stdio;
import sdltest;

void main(){
    SDL_version *ver = SDL_Linked_Version();
    writefln("%d.%d.%d", ver.major, ver.minor, ver.patch);
}

$ dmd a.d -L-lSDL
$ ./a
1.2.14
$ 

在这个例子中,我使用了一个SDL函数进行链接。通过dmd-L参数,您可以将参数传递给ld,在这种情况下是-lSDL以链接SDL。

D语言文件(.di)的描述在这里

您还应该查看htod


1
@StanislavFeldman: 我认为是这样,除非有人已经做过了。一些流行的库已经具有D绑定。您是否特别需要libxml?D具有std.xml 模块。我还添加了一个使用共享库的编译示例。 - Vlad
1
@StanislavFeldman:.di文件是包含函数签名的D源文件。可以将它们看作是C/C++头文件。如果要编写对某个C/C++库的绑定,不需要 .di文件。当你有自己的D库并且需要向客户端提供接口时,.di文件则变得更加重要。 - DejanLekic
感谢与我分享std.xml模块。它适用于HTML解析吗? - Stan
1
@StanislavFeldman:那是DejanLekic说你不需要.di。他说得对,你可以把你的签名放在.d文件中的extern(C){...}里。但如果有很多签名,单独使用.di文件可能更清晰。 - Vlad
Tango中还有一个XML解析器,据说速度要快得多:请看这里。不幸的是,我没有使用过它们,所以无法提供更多帮助。但我会说HTML比XML不那么严格,所以除非你正在解析XHTML,否则XML解析器可能不是最佳解决方案。 - Vlad
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接