Как преобразовать код C++ в C [закрыто]
Проблема с преобразованием C++ кода в C
У меня есть код на C++, в котором определено множество классов, их методы, конструкторы и деструкторы, а также несколько шаблонных классов и много других элементов C++. Теперь мне нужно преобразовать этот исходный код в обычный C.
У меня возникли следующие вопросы:
- Существуют ли инструменты для конвертации C++ кода и заголовочных файлов в C код?
- Нужно ли мне полностью переписывать код (т.е. придется удалить конструкторы и деструкторы, переместив соответствующий код в функции
init()
иdeinit()
; изменить классы на структуры, сделать существующие методы как указатели на функции в этих новых структурах и вызывать эти функции через указатели и т.д.)? - Если я должен буду сделать это вручную, на какие специфические для C++ конструкции и семантику кода следует обратить внимание при конвертации из C++ в C?
Спасибо за помощь!
3 ответ(ов)
Да, действительно существует такой инструмент — компилятор C++ от Comeau. Он генерирует код на C, который не получится поддерживать вручную, но это не проблема. Вы будете поддерживать код на C++, а по необходимости просто конвертировать его в C на лету.
Хотя в C можно реализовать объектно-ориентированный подход (например, добавив параметр theType *this
в методы и самостоятельно управляя чем-то вроде таблиц виртуальных функций для полиморфизма), это никогда не будет выглядеть удовлетворительно с точки зрения проектирования, и будет выглядеть неуклюже (даже с использованием некоторых хаков пре-процессора).
Я бы предложил хотя бы рассмотреть возможность перепроектирования, чтобы сравнить, как это будет работать.
В целом, многое зависит от ответа на ключевой вопрос: если у вас есть рабочий код на C++, зачем вам C?
Компилятор состоит из двух основных блоков: "фронт-энд" и "бэк-энд".
Фронт-энд компилятора анализирует исходный код и строит некоторую форму "промежуточного представления" этого исходного кода, которое гораздо легче анализировать машинным алгоритмом, чем сам исходный код. Например, исходный код на C++ разработан для того, чтобы помочь человеческому программисту писать код, тогда как промежуточная форма создана, чтобы упростить задачу для алгоритма, анализирующего это промежуточное представление.
Бэк-энд компилятора берет промежуточную форму и затем преобразует ее в "целевой язык".
Целевым языком для компиляторов общего назначения обычно являются ассемблерные языки для различных процессоров, но ничего не мешает бэк-энду компилятора производить код на любом другом языке, при условии, что этот целевой язык (по крайней мере) так же гибок, как ассемблер общего процессора.
Как вы, вероятно, могли представить, C действительно так же гибок, как ассемблер процессора, так что реализация компилятора C++ в C с технической точки зрения не представляет особой сложности.
Таким образом, у нас есть следующая схема: C++ ---фронтЭнд---> someIntermediaryForm ---бэкЭнд---> C.
Вы можете ознакомиться с этими ребятами: http://www.edg.com/index.php?location=c_frontend (вышеприведённая ссылка лишь информационная и показывает, что можно сделать; они лицензируют свои фронт-энды за десятки тысяч долларов).
P.S. Насколько мне известно, компилятора C++ в C от GNU нет, и это меня удивляет (если я прав). Поскольку язык C довольно небольшой, а его внутренние механизмы достаточно примитивны, разработка компилятора C требует примерно одного человека-года работы (я могу это сказать из собственного опыта, так как сам писал подобный компилятор много лет назад, и он производит промежуточный код для [виртуальной] стековой машины). Наличие поддерживаемого, актуального компилятора C++ при условии написания компилятора C лишь однажды было бы действительно здорово...
Как изменить цвет вывода echo в Linux
Разница между const int*, const int * const и int * const?
Почему переменные нельзя объявлять в операторе switch?
Как вывести список символов из .so файла?
`unsigned int` против `size_t`: когда и что использовать?