2013-10-01 2 views
17

Одна из моих (встроенных) целей имеет только компилятор C89.Есть ли способ скомпилировать C11-C89?

Я работаю над проектом (хобби), который нацелен на несколько устройств.

Есть ли способ скомпилировать (перетащить?) Базу кода C11 в C89? не

(В противном случае мне придется код, как это 1989, в буквальном смысле.)

+5

Добро пожаловать в мой мир - мой самый низкий общий знаменатель - это Microsoft MSVC, который до сих пор даже не поддерживает C99. –

+1

Получите кросс-компилятор? –

+11

Какие функции C11 вы используете? – SheetJS

ответ

8

Нет, я не думаю, что это возможно для всех С11. У C11 есть функции, которых просто нет в C89 или C99: _Generic, _Atomic, _Thread, _Alignof, четко определенные последовательности перед заказом, неназванные struct и union пользователей ... У них нет счетных частей в старых версиях и было бы действительно сложно до эмулировать.

Для любой из этих функций вам придется полагаться на расширения вашего целевого компилятора, возможно, возможно для некоторых функций для одного данного компилятора. Но было бы кошмаром написать такие инструменты, которые имели бы обычный C89 в качестве общей цели. Вам лучше реализовать компилятор C11 напрямую.

+0

Если нет необходимости получать читаемый исходный код, преобразование должно быть возможным с помощью clang/llvm – jeb

+0

@jeb, я не уверен. Чтобы реализовать некоторые из новых конструкций каким-то образом, безусловно, возможно с некоторым уродливым кодом. Но C11 имеет тонкие различия в своих гарантиях согласованности данных, которые могут быть трудно сопоставлены с C89. Дело в том, что при переходе от одного стандарта к другому все усилия прилагаются, чтобы поддерживать соответствующие программы для более старого стандарта, соответствующего новому. Но программы, которые имеют неопределенное поведение в более старом стандарте, могут стать действительными в новом. Это будет очень сложно «перевести» их на прежний стандарт без запуска этого UB. –

+0

Но поскольку C11 можно перевести в asm или в этом случае llvm, возможно, что вы можете создать из этого кода asm/llvm действительный код c89. – jeb

2

Как Карл NORUM комментарии:

Что ваша цель? Было бы трудно переносить clang/llvm?

Это, кажется, перспективный подход.
Нет необходимости переносить цель, достаточно порта для C89.

Итак, clang компилирует ваш код в llvm, а затем llvm в c89, а затем вы его получите.

+1

C backend был удален :-(http://llvm.org/releases/3.1/docs/ReleaseNotes.html#whatsnew – fadedbee

Смежные вопросы