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

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

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

  1. Есть ли какой-либо инструмент для преобразования кода C ++ и заголовочных файлов в код C?

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

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

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

http://llvm.org/docs/FAQ.html#translatecxx

PS: Я не использовал его вообще. сообщите мне, если это сработает.

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

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

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

Может быть, хороший фол ?

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

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

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

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

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

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

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

Зависит от того, что вы имеете в виду. Если вы имеете в виду, можно ли преобразовать C ++ в читаемый и поддерживаемый C-код? то извините, ответ No – C ++ функции не напрямую отображаются на C, плюс сгенерированный C-код не предназначен для людей. Если вы имеете в виду, есть ли компиляторы, которые конвертируют C ++ в C с целью компиляции на платформу, которая еще не имеет компилятора C ++? то вам повезло – продолжайте читать.

Компилятор, который компилирует C ++ в C, выполняет полный синтаксис и семантическую проверку в программе и просто использует C-код как способ генерации объектного кода. Такой компилятор – не просто какой-то причудливый макропроцессор. (И, пожалуйста, не пишите мне, утверждая, что это препроцессоры – они не являются – они являются полными компиляторами.) Можно реализовать все функции стандарта ISO C ++ путем перевода на C, и за исключением обработки исключений, это обычно приводит к в объектном коде с эффективностью, сравнимой с кодом, сгенерированным обычным компилятором C ++.

Вот некоторые продукты, которые выполняют компиляцию с C:

  • Comeau Computing предлагает компилятор на основе интерфейса Edison Design Group, который выводит код C.
  • LLVM – загружаемый компилятор, который испускает код C. См. Также здесь и здесь . Ниже приведен пример преобразования C ++ в C через LLVM .
  • Cfront , оригинальная реализация C ++, выполненная Bjarne Stroustrup и другими в AT & T, генерирует код C. Однако у него есть две проблемы: с середины 90-х годов было сложно получить лицензию, когда она начала проходить через лабиринт изменений собственности, а развитие прекратилось в это же время, и поэтому он не получает исправлений ошибок и не поддерживает никаких новых функций языка (например, исключений, пространств имен, RTTI, шаблонов участников).

  • Вопреки популярному мифу, на момент написания этой статьи нет версии g ++, которая переводит C ++ на C. Такая вещь кажется выполнимой, но я не знаю, что кто-то действительно ее сделал (пока).

Обратите внимание, что вам обычно нужно указать CPU, OS и C компилятора целевой платформы, чтобы сгенерированный C-код был специально предназначен для этой платформы. Это означает: (a) вы, вероятно, не можете взять код C, сгенерированный для платформы X, и скомпилировать его на платформе Y; и (б) будет трудно сделать перевод самостоятельно – это, вероятно, будет намного дешевле / безопаснее с одним из этих инструментов.

Еще раз: не пишите мне, что это просто препроцессоры – они не являются – они компиляторы.

Interesting Posts

Как изменить цвет фона окна по умолчанию в Windows 10?

Как выводить результаты запросов MySQL в формате CSV?

jQuery’s .click – передать параметры пользователю

Что более эффективно: вернуть значение против Pass by reference?

Есть ли способ изменить направление текста и * символ * в чисто текстовом документе?

Node.js / Express.js – Как работает app.router?

JTable с заголовками и столбцами

Могу ли я заставить браузер автоматически переадресовывать на некоторые страницы?

Как изменить ссылочное действие внешнего ключа? (поведение)

Android: как установить событие onClick для кнопки в элементе списка в ListView

Как я могу десериализовать объект, если он был перемещен в другой пакет или переименован?

Автоматически изменять размер изображения / изображения в Word?

Ajax публикует файл из формы с помощью Axios

Spring: Как ввести значение в статическое поле?

Gson TypeToken с динамическим типом ArrayList

Давайте будем гением компьютера.