Це не надто складно зробити вручну, але це залежатиме від розміру вашого інтерфейсу. Випадки, коли я це робив, полягали в тому, щоб дозволити використання нашої бібліотеки C ++ із чистого коду C, і, отже, SWIG не дуже допоміг. (Ну, можливо, для цього можна використовувати SWIG, але я не гуру SWIG, і це здавалося нетривіальним)
Все, що ми в підсумку зробили, це:
- Кожен об'єкт передається в C непрозорий дескриптор.
- Конструктори та деструктори обертаються чистими функціями
- Функції-члени - це чисті функції.
- Інші вбудовані елементи, де це можливо, відображаються на еквіваленти C.
Отже, такий клас (заголовок C ++)
class MyClass
{
public:
explicit MyClass( std::string & s );
~MyClass();
int doSomething( int j );
}
Було б відображено інтерфейс C на зразок цього (заголовок 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 );
Реалізація інтерфейсу буде виглядати так (джерело 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);
}
}
Ми отримуємо нашу непрозору ручку з оригінального класу, щоб уникнути необхідності будь-якого кастингу, та (Це, здається, не працювало з моїм поточним компілятором). Ми повинні зробити дескриптор структурою, оскільки C не підтримує класи.
Отже, це дає нам основний інтерфейс C. Якщо ви хочете отримати більш повний приклад, що показує один із способів інтеграції обробки винятків, тоді ви можете спробувати мій код на github: https://gist.github.com/mikeando/5394166
Найцікавішою частиною тепер є забезпечення того, щоб ви правильно отримали всі необхідні бібліотеки C ++, пов’язані з вашою більшою бібліотекою. Для gcc (або clang) це означає просто робити фінальний етап посилання за допомогою g ++.