Подтвердить что ты не робот

Создать оболочку C из С++?

Я хочу сгенерировать C-оболочки из библиотек С++. Есть учебники о том, как это сделать вручную:

Но это слишком тяжелый ручной труд.

Например, для этого:

struct RtAudio {
    virtual DeviceInfo const& f() {...}
    class DeviceInfo {
        virtual void g() { ... }
    };
    ...
};

Мне нужно написать:

struct RtAudioC {
    RtAudio x;
};
struct DeviceInfo {
    RtAudio::DeviceInfo x;
};
extern "C" {
    RtAudioC* newRtAudio() { 
        return new RtAudioC;
    }
    void deleteRtAudio(RtAudioC *p {
        delete p;
    }
    /* do something with RtAudio::f() */
    void g(DeviceInfo *p) {
        try {
            p->x.g();
        } catch (SomeError & err) {
        }
    }
}

Существуют ли инструменты, которые могут автоматизировать этот процесс?

4b9b3361

Ответ 1

Я только что разработал оболочку C-функции в Python, чтобы сделать именно это (сгенерировать классы С++, которые обертывают функции C).

Он еще молод, но основная часть того, что мне нужно, это сейчас. Попробуйте и дайте мне знать, что вы думаете: https://github.com/mlb5000/CFunctionWrapperGenerator

Ответ 2

Существует gmmproc, который создает С++-оболочки для библиотек C на основе gobject, но это единственный генератор кода, который я слышал о C и С++.

Если вы хорошо разбираетесь в парсере, задача создания базового генератора обертки не будет слишком сложной задачей. В конце концов вам, возможно, придется добавить несколько штрихов вручную, но ваша рабочая нагрузка будет уменьшена.

Ответ 3

Вы можете попробовать SWIG, генератор кода C был в прошлом году проектом GSoC. AFAIK они еще не объединили его с багажником, поэтому вам нужно будет проверить и построить ветку из SVN.

Ответ 4

Сколько вашего кода на С++ уже написано против того, сколько еще нужно написать? Если разумная пропорция должна быть написана, я бы создал упрощенный синтаксис, который генерирует как заголовки С++, так и C, например IDL для COM-интерфейсов. Этот упрощенный синтаксис будет намного проще для вас разобрать, чем С++, или вы можете найти что-то с полки, которое это делает.

Ответ 5

Я не знаю, как это сделать. Если вы хотите автоматизировать поколение и с удовольствием создадите свои собственные скрипты, pygccxml (на основе GCC-XML) - неплохой способ разобрать заголовки С++.