C là một trong những ngôn ngữ lâu đời nhất vẫn còn tồn tại. ABI của nó rất đơn giản và hầu như mọi hệ điều hành vẫn còn được sử dụng ngày nay đã được viết trong đó . Mặc dù một số trong các hệ điều hành đó có thể đã thêm nội dung, ví dụ như trong C # /. NET hoặc bất cứ thứ gì ở trên, phía dưới chúng rất dốc trong C.
Điều đó có nghĩa rằng, để sử dụng các chức năng được cung cấp bởi hệ điều hành, hầu như mọi ngôn ngữ lập trình ra có cần một cách để giao tiếp với các thư viện C nào . Perl, Java, C ++, tất cả họ đều natively cung cấp cách để "nói chuyện C", bởi vì họ đã phải nếu họ không muốn tái tạo lại mỗi bánh xe duy nhất có thể.
Điều này làm cho C là tiếng Latin của ngôn ngữ lập trình. (Có bao nhiêu năm internet trước phép ẩn dụ đó phải là "tiếng Anh của ngôn ngữ progamming"?)
Khi bạn viết thư viện bằng C, bạn sẽ có giao diện tương thích C miễn phí (rõ ràng). Nếu bạn đang viết thư viện của mình bằng C ++, bạn có thể nhận được các ràng buộc C, thông qua các extern "C"
khai báo như bạn đã đề cập.
Tuy nhiên , bạn có thể nhận được những cam kết ràng buộc chỉ cho các chức năng có thể được bày tỏ trong C .
Vì vậy, API thư viện của bạn không thể sử dụng ...
- mẫu,
- các lớp học,
- ngoại lệ,
- bất kỳ chức năng lấy hoặc trả lại đối tượng.
Một ví dụ đơn giản, bạn sẽ cần làm cho các hàm xuất của mình mất và trả về mảng ( []
) thay vì std::vector
(hoặc std::string
cho vấn đề đó).
Vì vậy, bạn không chỉ không thể cung cấp bất kỳ điều tốt nào mà C ++ cung cấp cho khách hàng của thư viện, mà bạn còn phải nỗ lực thêm để "dịch" API thư viện của bạn từ C ++ sang "Tương thích C" ( extern "C"
).
Đó là lý do tại sao có thể đưa ra rằng C là lựa chọn tốt hơn để triển khai thư viện. Cá nhân, tôi nghĩ rằng lợi ích của C ++ vẫn vượt xa nỗ lực cần thiết cho extern "C"
API, nhưng đó chỉ là tôi.