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

Как преобразовать код С++ в C

У меня есть код на С++. В коде определено множество классов, их функции-члены, конструкторы, деструкторы для этих классов, несколько классов шаблонов и множество материалов на С++. Теперь мне нужно преобразовать исходный код в простой код.

У меня есть следующие вопросы:

  • Есть ли какой-нибудь инструмент для преобразования кода С++ и файлов заголовков в код C?

  • Должен ли я делать полную перезапись кода (мне придется удалить конструкторы, деструкторы и переместить этот код в некоторые функции init(), deinit(), изменить классы на структуры, сделать существующие функции-члены как указатели функций в этих вновь определенных структурах, а затем вызывать эти функции с помощью указателей функций и т.д.)?

  • Если мне нужно самостоятельно преобразовать его, какие С++-специфические конструкторы/семантики кодовых данных мне нужно обратить внимание при выполнении преобразования из С++ в C?

4b9b3361

Ответ 1

Есть такой инструмент, компилятор Comeau С++., Он будет генерировать код C, который вы не можете сохранить вручную, но это не проблема. Вы будете поддерживать код С++ и просто конвертировать в C на лету.

Ответ 3

Пока вы можете делать OO в C (например, добавляя первый параметр theType *this к методам и вручную обрабатывая что-то вроде vtables для полиморфизма), это никогда не бывает особенно удовлетворительным, как дизайн, и будет выглядеть уродливым (даже с некоторым предварительным -процессорные хаки).

Я бы предложил по крайней мере посмотреть на перепроектирование, чтобы сравнить, как это будет работать.

В целом многое зависит от ответа на ключевой вопрос: если у вас есть рабочий код на С++, почему вы хотите C вместо?

Ответ 4

Может быть, хороший ol 'cfront будет делать?

Ответ 5

Компилятор состоит из двух основных блоков: "front end" и "back end". Передняя часть компилятора анализирует исходный код и создает некоторую форму "промежуточного представления" упомянутого исходного кода, который намного проще анализировать машинным алгоритмом, чем исходный код (то есть, в то время как исходный код, например, С++, предназначен для помочь программисту-человеку написать код, промежуточная форма предназначена для упрощения алгоритма, который легче анализирует указанную промежуточную форму). Задний конец компилятора принимает промежуточную форму и затем преобразует ее в "целевой язык".

Теперь целевой язык для компиляторов общего назначения - это ассемблерные языки для разных процессоров, но нет ничего, что могло бы запретить компилятору завершить работу над кодом на каком-то другом языке, пока указанный целевой язык не будет (по крайней мере) как общий процессорный сборщик.

Теперь, как вы можете себе представить, C определенно такой же гибкий, как и ассемблер CPU, так что компилятор С++ to C действительно не проблема для реализации с технической точки.

Итак, у вас есть: С++ --- frontEnd --- > someIntermediaryForm --- backEnd --- > C

Вы можете проверить эти ребята: http://www.edg.com/index.php?location=c_frontend (приведенная выше ссылка просто информативна для того, что можно сделать, они лицензируют свои передние концы за десятки тысяч долларов).

PS Насколько я знаю, такого компилятора С++ для C GNU нет, и это полностью меня бьет (если я прав по этому поводу). Поскольку C-язык довольно мал, и внутренние механизмы довольно рудиментарны, компилятор C требует чего-то вроде одного человеко-года работы (я могу сказать вам, что из первых рук я написал такой компилятор себе несколько лет назад, и он создает [ виртуальный] стековый промежуточный код) и возможность иметь поддерживаемый, обновленный компилятор С++, хотя только писать C-компилятор однажды было бы замечательно...

Ответ 6

Это старый поток, но, по-видимому, C++ Faq имеет раздел . Это, видимо, будет обновляться, если с автором связывается, поэтому это, вероятно, будет более актуальным в долгосрочной перспективе.