2010-06-11 46 views
20

D dễ dàng giao tiếp với C.Khả năng tương thích liên kết giữa C++ và D

D cũng dễ dàng giao tiếp với C++, nhưng (và lớn) nhưng C++ cần phải vô cùng tầm thường. Mã này không thể sử dụng:

  • namespace
  • mẫu
  • đa kế thừa
  • hỗn hợp ảo với các phương pháp không ảo
  • hơn?

Tôi hoàn toàn hiểu được hạn chế kế thừa. Phần còn lại tuy nhiên, cảm thấy như những hạn chế nhân tạo. Bây giờ tôi không muốn có thể sử dụng trực tiếp std::vector<T>, nhưng tôi thực sự muốn có thể liên kết với std::vector<int> dưới dạng mẫu bên ngoài.

C++ interfacing page có nhận xét đặc biệt đáng buồn này.

D mẫu có ít điểm chung với C++ mẫu, và nó là rất khó xảy ra rằng bất kỳ loại phương pháp hợp lý thể được tìm thấy để diễn tả C++ mẫu trong một cách liên kết tương thích với D.

Điều này có nghĩa rằng STL C++ và C++ Boost, có thể sẽ không bao giờ có thể truy cập từ D.

phải thừa nhận rằng tôi sẽ probabl y không bao giờ cần std::vector khi mã hóa trong D, nhưng tôi muốn sử dụng QT hoặc boost.

Vì vậy, thỏa thuận là gì. Tại sao lại khó thể hiện các lớp học C++ không quan trọng trong D? Nó sẽ không có giá trị nó để thêm một số chú thích đặc biệt hoặc một cái gì đó để thể hiện ít nhất là không gian tên?


Cập nhật: "D đã hỗ trợ namespace trong các tác phẩm" từ Walter Bright.

+11

Nó thậm chí không được hỗ trợ bởi bất kỳ trình biên dịch C++ chính thống nào. Tại sao bạn mong đợi một ngôn ngữ khác để hỗ trợ nó? –

+5

@Hans, ý bạn là gì? –

+3

Tôi nghĩ ý anh ấy là "Liên kết tới C++ được tạo bởi trình biên dịch X" thậm chí không được hỗ trợ bởi {trình biên dịch C++ chính thống} \ X. – FeepingCreature

Trả lời

27

FWIW Qt có một tích cực phát triển bắt buộc đối với D: http://www.dsource.org/projects/qtd

Tôi nghĩ rằng nhiều thành phần trong thúc đẩy được quá cao gắn với C++ để được cầm tay có ý nghĩa với các ngôn ngữ khác.

Sử dụng ví dụ: std :: vector là có thể nếu bạn dành thời gian viết các hàm bình thường (ví dụ: không gian tên) để chuyển tiếp tới các hàm thành viên thích hợp. Tedious, nhưng giá cả phải chăng (cho các thành phần cấp cao hơn, có lẽ không phải cho std :: vector).

Ngoài ra, gần đây tôi đã kiểm tra trong thư viện chuẩn một mảng được niêm phong và triển khai heap nhị phân được niêm phong sử dụng tính toán tham chiếu, không có tài nguyên, và hủy diệt xác định thay vì thu gom rác thải (xem http://www.dsource.org/projects/phobos/browser/trunk/phobos/std/container.d). Các thùng chứa khác sẽ theo sau. Các thùng chứa này sử dụng ba kỹ thuật cụ thể (được mô tả trong bài viết sắp tới của tôi "Thùng chứa kín") để đạt được sự hủy diệt xác định mà không ảnh hưởng đến sự an toàn của chương trình.

Các thùng chứa được đóng kín hy vọng sẽ làm giảm mọi nhu cầu liên kết với hộp chứa STL, ngay cả đối với các ứng dụng chặt chẽ không thể thu gom rác thải.

+0

Chỉ biết một chút về STL và không biết nhiều về Boost, tôi khẳng định rằng sẽ không có gì gần như không thể thực hiện tốt hơn hoặc tốt hơn trong D. Điều đó cho biết, việc có thể sử dụng chúng sẽ cho phép tương tác tốt hơn với mã C++ cấp cao hơn. – BCS

+2

Thư viện tăng cường mà tôi muốn đặc biệt là Boost.Asio. Tôi không biết về một thư viện mạng chéo có thể so sánh được. Tôi chắc rằng tôi có thể tìm người khác. Ngoài ra nó không phải là một thư viện tương tự không thể được viết bằng D, nó là nó đã được viết, thử nghiệm, và được sử dụng rất nhiều dự án khác nhau. –

17

Như Hans Passant đề cập trong nhận xét, mức độ khả năng tương tác mà bạn muốn giữa D và C++ thậm chí không được hỗ trợ trong các trình biên dịch C++ khác nhau. Có một tiêu chuẩn C++ ABI (Giao diện nhị phân ứng dụng) có vẻ như có một số hỗ trợ, nhưng tôi không chắc chắn chính xác cách thức mở rộng (các trình biên dịch Intel, GCC và ARM có vẻ tuân theo ABI). Tôi đã không cần phải sử dụng nó, và tôi không chắc liệu Microsoft có tuân theo nó cho các trình biên dịch x86 hay x64 của họ hay không (tôi tưởng tượng nó có thể cho ia64, vì đó là nơi bắt đầu tiêu chuẩn ABI).

Xem "Interoperability & C++ Compilers" by Joe Goodman để biết một số chi tiết về C++ ABI.

Có lẽ Walter Bright có thể được thuyết phục để hỗ trợ khả năng tương tác D với thư viện/đối tượng C++ tuân theo tiêu chuẩn ABI (mặc dù tôi không chắc chắn nơi anh ta có thể ưu tiên).

2

Chỉ để cho vui, tôi đã giao tiếp với một số mã C++.

Điều đó có thể sẽ không trả lời cho câu hỏi của bạn, nhưng tôi nghĩ bạn (và một số người trong cộng đồng D) có thể quan tâm đến một số ghi chú tôi đã thực hiện sau đó. Ở đây nó đi: TechNotes.

+0

plus 1 cho tài liệu chế độ lỗi – Quonux

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