2010-03-08 31 views
20

là có cách nào mà tôi có thể gọi C++ mã từ mã cgọi C++ mã từ c

class a 
{ 
    someFunction(); 
}; 

làm thế nào để gọi someFunction() từ một mã c.

theo cách khác tôi hỏi làm thế nào để tránh tên mangling đây

liên quan Vinayaka Karjigi

Trả lời

12
  1. Đầu tiên, hãy viết một wrapper API C vào thư viện dựa trên đối tượng của bạn. Ví dụ nếu bạn có một lớp Foo với một thanh phương thức(), trong C++ bạn sẽ gọi nó là Foo.bar(). Khi tạo một giao diện C, bạn phải có một thanh chức năng (toàn cục) để đưa con trỏ đến Foo (lý tưởng ở dạng con trỏ void cho độ đục).
  2. BẬT KẾT CẤU cho API C bạn đã xuất trong "C" bên ngoài.

(Tôi không nhớ tất cả các nhà khai thác giả mạo cho C++ off-hand và quá lười để tra cứu, vì vậy hãy thay thế (Foo *) bằng một dàn diễn viên cụ thể hơn nếu bạn thích trong đoạn mã sau.)

// My header file for the C API. 
extern "C" 
{ 
    void bar(void* fooInstance); 
} 

// My source file for the C API. 
void bar(void* fooInstance) 
{ 
    Foo* inst = (Foo*) fooInstance; 
    inst->bar(); 
} 
+2

Tại sao sử dụng void * thay vì loại thực tế? Việc chuyển bất kỳ loại ngẫu nhiên nào cùng với dàn diễn viên kiểu c có vẻ giống như một công thức cho thảm họa. –

+5

Bởi vì "loại thực tế" là một cấu trúc C++ và không có (an toàn) C tương đương. –