Tôi thường nghe mọi người nói rằng các lập trình viên C ++ nên trưng ra API công khai / sản phẩm của thư viện của họ dưới dạng API C.
Điều đó có nghĩa là gì và những lợi thế của điều đó là gì?
Tôi thường nghe mọi người nói rằng các lập trình viên C ++ nên trưng ra API công khai / sản phẩm của thư viện của họ dưới dạng API C.
Điều đó có nghĩa là gì và những lợi thế của điều đó là gì?
Câu trả lời:
Điều đó có nghĩa là phần thư viện của bạn được hiển thị dưới dạng giao diện chỉ sử dụng "phần" C của ngôn ngữ, vì vậy bạn không xuất các lớp hoặc tương tự, chỉ các hàm, POD và cấu trúc có chứa POD. Thêm vào đó, bạn phải vô hiệu hóa việc xáo trộn tên C ++, thường đạt được bằng cách đánh dấu các chức năng là extern "C"
. Một ví dụ điển hình sẽ là:
extern "C" void foo(int bar);
Ưu điểm lớn của việc phơi bày các thư viện của bạn theo cách này là hầu như mọi ngôn ngữ lập trình ngoài kia đều có cơ chế giao tiếp trực tiếp với thư viện C, nhưng chỉ rất ít người có thể giao tiếp trực tiếp với thư viện C ++. Vì vậy, theo nghĩa đó, bạn đi đến mẫu số chung thấp nhất để giúp người khác dễ dàng sử dụng thư viện của bạn.
Tuy nhiên, hãy nhớ rằng đây thực sự chỉ là một chiến lược hữu ích nếu bạn đang sản xuất một thư viện để người khác tiêu thụ. Nếu bạn đang xây dựng một phần mềm chỉ có C ++ và các thư viện chỉ cần giao tiếp với nhau, bạn (IMHO) tốt hơn hết là nên phơi bày API C ++ thích hợp để bạn có thể sử dụng toàn bộ sức mạnh của ngôn ngữ.
extern "C"
thứ mà tôi đã không nhận được?
.hpp
, nhưng phần mở rộng này có nghĩa là "tệp tiêu đề C ++", do đó, nó nên được .h
sử dụng cho cả C và C ++.
Ngoài câu trả lời của Timo - không có C ++ ABI nổi bật cho một số nền tảng (ví dụ Windows - một số như Linux của Mac OS X được áp dụng rộng rãi), do đó, không chỉ thiếu tính năng mà còn không thể thực hiện tính năng đó.
Ví dụ: IIRC MSVC có ABI khác nhau trong mỗi phiên bản và nó có thể thay đổi tùy thuộc vào việc gỡ lỗi hay phát hành bản dựng - và nó không được xuất bản nên trình biên dịch của bên thứ 3 thường không tương thích (Tôi đọc một số thông tin rằng một số phiên bản icc tương thích với MSVC 2005 nhưng đó có thể là thông tin được tiết lộ theo NDA - không cần thiết cho những người tạo ra Python nói và sử dụng ABI của riêng họ. Vì vậy, trong môi trường ngôn ngữ thực tế sẽ giới hạn không chỉ phiên bản trình biên dịch mà còn cả cờ.
Cuối cùng, C ++ có nhiều tính năng biên dịch thời gian hơn. Ví dụ, thuốc generic thường không tồn tại trong các ngôn ngữ được gõ động, v.v.