Việc phơi bày mã C ++ công khai dưới dạng API C có nghĩa là gì và những lợi thế của việc này là gì?


25

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:


44

Đ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ữ.


14
Bạn phải cẩn thận để không xuất ngoại lệ ném!
James

Đó là một câu trả lời tuyệt vời. Bạn có thể cho tôi một ví dụ về những extern "C"thứ mà tôi đã không nhận được?
Daniel Ribeiro

1
@DanielRibeiro: chỉ cần google cho "extern C". Bạn sẽ tìm thấy các liên kết như thế này: stackoverflow.com/questions/1041866/iêu
Doc Brown

1
@DanielRibeiro, ví dụ rất đơn giản được thêm vào.
Timo Geusch

1
@DanielRibeiro Về mặt kỹ thuật vẫn có thể sử dụng .hpp, nhưng phần mở rộng này có nghĩa là "tệp tiêu đề C ++", do đó, nó nên được .hsử dụng cho cả C và C ++.
leeme

8

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.


2
@DanielRibeiro: Chào mừng bạn đến địa ngục tuyệt vời của C ++ ABI ( en.wikipedia.org/wiki/Application_binary_interface ). Phiên bản ngắn là rất khó để làm cho các thành phần C ++ được biên dịch riêng (được biên dịch với các trình biên dịch / cờ khác nhau) để hoạt động cùng nhau thay vì âm thầm bị lỗi / sụp đổ.
Maciej Piechotka
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.