Điều này không quá khó để làm bằng tay, nhưng sẽ phụ thuộc vào kích thước giao diện của bạn. Các trường hợp mà tôi đã làm là cho phép sử dụng thư viện C ++ của chúng tôi từ bên trong mã C thuần túy, và do đó SWIG không giúp được gì nhiều. (Chà có thể SWIG có thể được sử dụng để làm điều này, nhưng tôi không phải là chuyên gia SWIG và nó có vẻ không tầm thường)
Tất cả những gì chúng tôi đã làm là:
- Mọi đối tượng được chuyển về trong C một tay cầm không trong suốt.
- Bộ tạo và bộ hủy được bao bọc trong các chức năng thuần túy
- Các hàm thành viên là các hàm thuần túy.
- Các nội trang khác được ánh xạ tới C tương đương nếu có thể.
Vì vậy, một lớp như thế này (tiêu đề C ++)
class MyClass
{
public:
explicit MyClass( std::string & s );
~MyClass();
int doSomething( int j );
}
Sẽ ánh xạ đến một giao diện C như thế này (tiêu đề C):
struct HMyClass;
typedef struct HMyClass HMyClass;
HMyClass * myStruct_create( const char * s );
void myStruct_destroy( HMyClass * v );
int myStruct_doSomething( HMyClass * v, int i );
Việc triển khai giao diện sẽ như thế này (nguồn C ++)
#include "MyClass.h"
extern "C"
{
HMyClass * myStruct_create( const char * s )
{
return reinterpret_cast<HMyClass*>( new MyClass( s ) );
}
void myStruct_destroy( HMyClass * v )
{
delete reinterpret_cast<MyClass*>(v);
}
int myStruct_doSomething( HMyClass * v, int i )
{
return reinterpret_cast<MyClass*>(v)->doSomething(i);
}
}
Chúng tôi lấy bộ xử lý không rõ ràng của mình từ lớp gốc để tránh cần bất kỳ quá trình truyền nào và (Điều này dường như không hoạt động với trình biên dịch hiện tại của tôi). Chúng ta phải làm cho xử lý là một cấu trúc vì C không hỗ trợ các lớp.
Vì vậy, điều đó cho chúng ta giao diện C cơ bản. Nếu bạn muốn có một ví dụ hoàn chỉnh hơn cho thấy một cách mà bạn có thể tích hợp xử lý ngoại lệ, thì bạn có thể thử mã của tôi trên github: https://gist.github.com/mikeando/5394166
Phần thú vị bây giờ là đảm bảo rằng bạn nhận được tất cả các thư viện C ++ cần thiết được liên kết vào thư viện lớn hơn của bạn một cách chính xác. Đối với gcc (hoặc clang) có nghĩa là chỉ thực hiện giai đoạn liên kết cuối cùng bằng cách sử dụng g ++.