D programından C++ işlevi nasıl çağırılır? Hala nasıl yapılacağını anlayamıyorum. Hangi komutları yürütmem gerekiyor? Fedora'da dmd kullanıyorum. C işlevlerini çağıran eğer ben, aklınıza gelebilecekD dilinde C++ (C) çağrısı
cevap
En basit örnek:
$ 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
$
paylaşılan nesneleri kullanarak ediyorsanız olabilir bu yüzden böyle bir şey: Bu örnekte
$ 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
$
Ben bir SDL işlevi ile bağlantılı. dmd
argümanı, ld
argümanlarını geçmenize izin verir, bu durumda SDL ile bağlantı kurmak için -lSDL
. D arabirim dosyaları (.di
) here belgesinde açıklanmaktadır.
Ayrıca htod'a da göz atmalısınız.
Bu harika! Çok teşekkür ederim. İşe yarıyor. .di dosyası nedir? Daha önce okumadım. – Stan
Yani, örneğin, libxml kullanmak için kullanacağım işlevler için bağlayıcılar yazmam gerekiyor, değil mi? – Stan
@StanislavFeldman: Sanırım birileri daha önce yapmadıkça. Bazı popüler kütüphanelerde zaten D bağlamaları var. Özellikle libxml'e ihtiyacınız var mı? D bir ['std.xml'] (http://dlang.org/phobos/std_xml.html) modülüne sahiptir. Ayrıca paylaşılan kütüphaneler ile bir derleme örneği ekledim. – Vlad
Sadece C ile çalıştığını görünse de, http://dlang.org/interfaceToC.html adresine bakmayı deneyin. C++ ile nasıl bağlantı kuracağınıza ilişkin önerilere buradan bakabilirsiniz: http://dlang.org/cpp_interface. html –
Bu eğiticiye baktım. .di dosyası hakkında açıklama eksik. Bana çözüm paylaşan Vlad için teşekkürler. – Stan