Добрый день!
Решил я запилить open source средство для автоматического враппинга С++ кода.
Компиляторов С\С++ много, у каждого свой ABI, соглашения о наименовании методов (name mangling) разные.
Даже размер std::string разный в Debug и Release.
Думаю, что получиться что-то вроде Swig в первом приближении, но не он.
Упор будет делаться на то, что генерируемые С-обвёртки будут читаемы для пользователей, а также то, что ими могут пользоваться С-программисты.
Ну и на стороне клиенты будет еще (опционально) генерироваться С++ header only style библиотека для возврата этого дела опять в С++.
Типа есть класс
class Printer
{
private:
int some_member;
public:
Printer() : some_member(0) {}
void Show()
{
std::cout << "Member " << some_member << std::endl;
}
};
И будут генерироваться С-обвертки:
extern "C" void* printer_create();
extern "C" void printer_destroy(void* printer);
extern "C" void printer_show(void* printer);
ну и С++ врапперы:
class Printer
{
private:
void * printer_handle;
public:
Printer()
{
printer_handle = printer_create();
}
~Printer()
{
printer_destroy(printer_handler);
}
void Show()
{
printer_show(printer_handle);
}
};
Ну, и вообще, наблюдал несколько разных библиотек, имеющих С API, написанное в духе С++,
то есть имеется метод
имя_класса_create()
имя_класса_destoy(),
имя_класса_
имя_метода(),
this обычно пробрасывается как первый аргумент void* или HANDLE. Да тот же WinAPI
Другие примеры
ZeroMQ, и C++
биндинг к ней.
То есть средство должно быть как можно легковесней, не быть очередным COM.
У Swig есть С-генератор, но он вроде заброшен.
Плюс Swig парсит C++\C заголовки, я же планирую облегчить себе жизнь,
вводя описание API как внешние XML файлы в формализированном виде.
Кто что думает?
P.S.: На следующей недели обещаю принести ссылку на код.