Для поддержки нескольких платформ в C/C++ можно использовать препроцессор для включения условной компиляции. Например.,
#ifdef _WIN32
#include <windows.h>
#endif
Как вы можете сделать это в Аде? У Ады есть препроцессор?
Для поддержки нескольких платформ в C/C++ можно использовать препроцессор для включения условной компиляции. Например.,
#ifdef _WIN32
#include <windows.h>
#endif
Как вы можете сделать это в Аде? У Ады есть препроцессор?
Ответ на ваш вопрос — нет, в Аде нет встроенного в язык препроцессора. Это означает, что каждый компилятор может иметь или не иметь его, и не существует «унифицированного» синтаксиса для предварительной обработки и таких вещей, как условная компиляция. Это было сделано намеренно: это считалось «вредным» для духа Ады.
Почти всегда есть способы обойти отсутствие препроцессора, но часто решение может быть немного громоздким. Например, вы можете объявить функции, специфичные для платформы, как «отдельные», а затем использовать инструменты сборки для компиляции правильной (либо система проекта, используя замену тела прагмы, либо очень простая система каталогов... поместите все файлы Windows в /windows/ и все файлы linux в /linux/ и включите соответствующий каталог для платформы).
При всем при этом GNAT понял, что иногда вам нужен препроцессор, и создал gnatprep. Он должен работать независимо от компилятора (но вам нужно будет вставить его в процесс сборки). Точно так же для простых вещей (таких как условная компиляция) вы, вероятно, можете просто использовать препроцессор c или даже создать свой собственный очень простой.
AdaCore предоставляет препроцессор gnatprep, специализированный для Ada. Они заявляют, что gnatprep «не зависит от каких-либо специальных функций GNAT», поэтому звучит так, как будто он должен работать с компиляторами Ada, отличными от GNAT. Их Руководство пользователя также содержит некоторые советы по условной компиляции.
Я работал над проектом, в котором также использовался формат m4, а файлы спецификации и тела Ada имели суффиксы «.m4s» и «.m4b» соответственно.
Я предпочитаю вообще избегать предварительной обработки и просто использовать специализированные органы, настраивая CM и процесс сборки для управления ими.
Нет, но препроцессор CPP или m4 можно вызвать для любого файла в командной строке или с помощью инструмента сборки, такого как make или ant. Я предлагаю назвать ваш файл .ada как-то иначе. Я сделал это в течение некоторого времени на java-файлах. Я вызываю java-файл .m4 и использую правило make для создания .java, а затем создаю его обычным способом.
Надеюсь, это поможет.
Да, это имеет.
Если вы используете компилятор GNAT, вы можете использовать gnatprep
для предварительной обработки, или, если вы используете GNAT Programming Studio, вы можете настроить файл проекта, чтобы определить некоторые переключатели условной компиляции, такие как
#if SOMESWITCH then
-- Your code here is executed only if the switch SOMESWITCH is active in your build configuration
#end if;
В этом случае вы можете использовать gnatmake
или gprbuild
, чтобы вам не приходилось запускать gnatprep
вручную.
Это очень полезно, например, когда вам нужно скомпилировать один и тот же код для нескольких разных ОС, используя даже разные кросс-компиляторы.
Некоторые старые компиляторы эпохи Ады 1983 года имеют пакет под названием a.app, в котором использовалось подмножество Ады с префиксом # (интерпретируемое во время сборки) в качестве языка предварительной обработки для генерации Ады (для последующего преобразования в машинный код во время компиляции). Система разработки Rational Verdix Ada Development System (VADS), по-видимому, является прародителем a.app среди нескольких компиляторов Ada. Sun Microsystems, например, унаследовала Ada SPARCompiler от VADS и, таким образом, также имела файл .app. Это мало чем отличается от использования PL/I в качестве препроцессора PL/I, что и сделала IBM.
В главе 2 приведена некоторая документация о том, как выглядит файл .app: http://dlc.sun.com/pdf/802-3641/802-3641.pdf
Нет.
Если вы действительно хотите его, есть способы его получить (используйте C, используйте автономный и т. д.). Однако я бы возражал против этого. Это было целенаправленное дизайнерское решение, чтобы не иметь его. Вся идея препроцессора очень неадекватна.
Большая часть того, для чего используется препроцессор C, может быть выполнена в Ada другими, более надежными способами. Единственным важным исключением является внесение незначительных изменений в исходный файл для кроссплатформенной поддержки. Учитывая, как часто этим злоупотребляют в типичной кросс-платформенной программе на языке C, я все же рад, что в Аде нет его поддержки. Очень немногие разработчики C/C++ могут достаточно контролировать себя, чтобы сохранить «незначительные» изменения. Результат может работать, но человеку часто почти невозможно прочитать его.
Типичный способ Ады для достижения этого — поместить разный код в разные файлы и использовать вашу систему сборки, чтобы каким-то образом выбирать между ними во время компиляции. Make достаточно мощный, чтобы помочь вам сделать это.