Beautiful C API
От: GhostCoders Россия  
Дата: 22.04.16 13:44
Оценка: 7 (3)
Добрый день!

Решил я запилить 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.: На следующей недели обещаю принести ссылку на код.
Третий Рим должен пасть!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.