2012-04-08 36 views
8

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ı

+2

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 –

+0

Bu eğiticiye baktım. .di dosyası hakkında açıklama eksik. Bana çözüm paylaşan Vlad için teşekkürler. – Stan

cevap

14

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.

+0

Bu harika! Çok teşekkür ederim. İşe yarıyor. .di dosyası nedir? Daha önce okumadım. – Stan

+0

Yani, örneğin, libxml kullanmak için kullanacağım işlevler için bağlayıcılar yazmam gerekiyor, değil mi? – Stan

+1

@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