2011-02-12 42 views
10

tôi cần viết thư viện bằng C++, có thể sử dụng được bởi máy khách để thực hiện một số thao tác trong máy chủ từ xa. Điều duy nhất trong cụ thể tôi đã không làm được nêu ra nó là: Thư viện C++ cần một giao diện C. Hãy để tôi giải thích tốt hơn: Từ khách hàng sử dụng lib này tôi cần phải gọi một cái gì đó như: int hoạt động (void * addr); nếu int < 0 lỗi và do đó .. Nhưng thư viện đó là một lớp trong C++. Vì vậy, câu trả lời của tôi là .. Cần tôi một biến toàn cầu giữ dụ của lớp trong thư viện? Một số tùy chọn tốt hơn để phát triển giao diện C của lớp C++ này là gì?thư viện C++ với giao diện c

Thx trong lời khuyên để trả lời.

+4

Câu trả lời chính đã ngừng hoạt động. Đừng quên 'extern" C "{}' khai báo giao diện của bạn. –

+2

http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html – Flexo

+1

Để biết ví dụ thực tế, hãy xem thư viện 0MQ, http://www.zeromq.org: được viết bằng C++ với giao diện C (và giao diện C++ được bao quanh). –

Trả lời

16

Bạn có thể sử dụng PIMPL idiom trong trình bao bọc C. Bạn cung cấp một phương thức YourClass_Create gọi nội bộ hàm khởi tạo (sử dụng new) và trả về con trỏ tới cá thể lớp của bạn; đối với mã máy khách, điều này sẽ chỉ là một xử lý mờ (có thể là typedef cho void *), được chuyển đến mọi chức năng của giao diện C của bạn để chỉ định trên trường hợp nào nó phải hoạt động (giống như FILE * trong stdio).

Tất cả các chức năng này sẽ phải làm là gọi phương thức tương ứng trên tay cầm (chuyển đổi về con trỏ đến lớp của bạn) và dịch ngoại lệ thành mã lỗi.


Như @ jdv-Jan de Vaan chỉ ra trong bình luận của mình, đừng quên cần thiết #ifdef ed extern "C" {} xung quanh mã C wrapper của bạn, nếu không bạn có thể nhận được mối liên kết lỗi.