Ответ 1
Если вы используете LLVM, llvm-g++
скомпилирует ваш код на С++ в LLVM-биткод, а llc
имеет бэкэнд, который преобразует бит-код в C.
Вы можете написать такие команды:
llvm-g++ -emit-llvm -c foo.cpp -o foo.o
llc -march=c <foo.o >foo.c
В настоящее время я управляю некоторым кодом на С++, который работает на нескольких платформах из одного исходного дерева (Win32, Linux, Verifone CC-терминалы, MBED и даже Nintendo GBA/DS). Однако мне нужно создать приложение, нацеленное на встроенную платформу, для которой нет компилятора С++ (только C). Я помню, что многие из ранних компиляторов С++ были только передними строками на существующих компиляторах C (например, для колонок, например MSC). Есть ли такие компиляторы 'frontend' С++, которые используются сегодня, которые будут генерировать C-код.
Tools Platform
----------- ------------
______Visual C++ _____ WIN32
/
/_______MBED (ARM)_______MBED (ARM dev board).
/
/_________GCC (x86)________Linux
/
Source____/___________GCC (ARM)________GBA/DS
\
\__________SDA______________Verifone Verix CC Terminals
\
\________ARM SDT__________Verifine VerixV CC terminals
\
\______????_____________Renases M8/16/32.
\
\____????_____________Z8 family.
Последние две платформы у меня есть хорошие компиляторы C, но не С++.
Как вы можете видеть, я поддерживаю большое количество платформ, и я разделяю большую часть кода библиотеки (и некоторый код приложения).
Если вы используете LLVM, llvm-g++
скомпилирует ваш код на С++ в LLVM-биткод, а llc
имеет бэкэнд, который преобразует бит-код в C.
Вы можете написать такие команды:
llvm-g++ -emit-llvm -c foo.cpp -o foo.o
llc -march=c <foo.o >foo.c
Comeau С++ делает это.
Невозможно помочь с Z8, но семейство Renesas M16C/M32C имеет GCC в эти дни - см. http://www.kpitgnutools.com/ для предварительно скрещенного креста toolchain, размещенный в Windows. Я еще не использовал его сам, но может быть лучшим вариантом, чем сторонний интерфейс С++, особенно если ваш код уже нацелен на GCC на других платформах.
Comeau С++ генерирует C в качестве своего вывода, и они, похоже, очень счастливы переносить его для работы с различными компиляторами на заднем плане, хотя я не уверен в точном ценообразовании для этого.
Если вы хотите немного больше использовать "свой собственный" подход, вы можете купить лицензию на компилятор EDG С++. Он обычно используется в качестве интерфейсного (например, компанией "Комо" и Intel), но я считаю, что по мере его доставки он включает в себя генератор кода, который выдает C в качестве вывода. Его лицензирование больше ориентировано на поставщиков компиляторов, поэтому лицензия дает вам много прав, но довольно дорого.
Устаревший, но, возможно, вы хотите попробовать cfront?
Я оставлю это для информации - cfront не поддерживает исключение.
Из того, что я понял, поддержка С++ в gcc для r8c/m16c/r32c не достаточно зрелая и достаточно хороша для производственного кода. Но для r8c/m16c/m32c/r32c существует хотя бы один компилятор, поддерживающий встроенный С++, и это IAR, я думаю, Tasking также поддерживает встроенный С++ на m16c.