2012-04-08 40 views
8

Cách gọi hàm C++ từ chương trình D? Tôi vẫn không thể hiểu cách thực hiện. Tôi cần thực hiện các lệnh nào? Tôi sử dụng dmd trong Fedora.Gọi C++ (C) từ ngôn ngữ D

+2

Hãy thử xem http://dlang.org/interfaceToC.html, mặc dù nó có vẻ chỉ hoạt động với C. Bạn có thể xem các đề xuất ở đây về cách giao diện với C++: http://dlang.org/cpp_interface. html –

+0

Tôi đã xem hướng dẫn đó. Nó bị mất mô tả về tập tin .di. Cảm ơn Vlad đã chia sẻ với tôi giải pháp. – Stan

Trả lời

14

ví dụ đơn giản nhất tôi có thể nghĩ ra, nếu bạn đang gọi điện thoại chức năng 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 
$ 

Nếu bạn đang sử dụng đối tượng chia sẻ, bạn có thể để một cái gì đó như:

$ 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 
$ 

Trong ví dụ này , Tôi đã liên kết với hàm SDL. Đối số -L cho dmd cho phép bạn chuyển đối số đến ld, trong trường hợp này là -lSDL để liên kết với SDL.

D tệp giao diện (.di) được mô tả here.

Bạn cũng nên xem htod.

+0

Tuyệt vời! Cảm ơn nhiều. Nó hoạt động. Tệp .di là gì? Tôi đã không đọc về nó trước đây. – Stan

+0

Vì vậy, ví dụ, để sử dụng libxml tôi cần phải viết các ràng buộc cho các chức năng mà tôi sẽ sử dụng, phải không? – Stan

+1

@StanislavFeldman: Tôi nghĩ vậy, trừ khi ai đó đã làm điều đó trước đây. Một số thư viện phổ biến đã có liên kết D. Bạn có cần libxml không? D có mô-đun ['std.xml'] (http://dlang.org/phobos/std_xml.html). Tôi cũng đã thêm một ví dụ biên dịch với các thư viện được chia sẻ. – Vlad