2010-08-22 37 views
7

Có thể không? tức là biên dịch .c với dmc và .d với dmd và sau đó liên kết chúng lại với nhau, điều này có hiệu quả không? Liệu tôi có thể gọi các hàm D từ mã C, chia sẻ các hình cầu ...? Cảm ơn.Trộn mã C và D trong cùng một chương trình?

Trả lời

10

Có thể thực hiện được. Trong thực tế, đây là một trong những tính năng chính của dmd. Để gọi hàm D từ C, chỉ cần thực hiện chức năng đó extern(C), ví dụ:

// .d 
import std.c.stdio; 
extern (C) { 
    shared int x; // Globals without 'shared' are thread-local in D2. 
        // You don't need shared in D1. 
    void increaseX() { 
    ++ x; 
    printf("Called in D code\n"); // for some reason, writeln crashes on Mac OS X. 
    } 
} 
// .c 
#include <stdio.h> 
extern int x; 
void increaseX(void); 

int main (void) { 
    printf("x = %d (should be 0)\n", x); 
    increaseX(); 
    printf("x = %d (should be 1)\n", x); 
    return 0; 
} 

Xem Interfacing to C để biết thêm.

+1

+1 cho liên kết chính xác đến đúng trang. Lưu ý rằng mã C và mã D phải nằm trong các tệp riêng biệt. (Nghe rõ ràng, nhưng vẫn nên được tuyên bố rõ ràng.) –

1

Câu trả lời ở trên không đúng như tôi biết. Bởi vì thói quen chính của D phải được gọi trước khi bạn sử dụng bất kỳ chức năng D nào. Điều này là cần thiết để "khởi tạo" D, f.e. bộ sưu tập rác của nó. Để giải quyết điều đó, bạn chỉ có thể làm cho chương trình được nhập vào bằng một thói quen chính trong D hoặc bằng cách nào đó bạn có thể gọi thường trình D chính từ C. (Nhưng tôi không biết chính xác cách này hoạt động)

+1

Đây là cuộc thảo luận từ năm 2007 về điều đó: http://www.digitalmars.com/d/archives/digitalmars/D/learn/Calling_D_from_C_-_What_s_the_present_status_6003.html –

Các vấn đề liên quan