У Ады есть препроцессор?

Для поддержки нескольких платформ в C/C++ можно использовать препроцессор для включения условной компиляции. Например.,

#ifdef _WIN32
  #include <windows.h>
#endif

Как вы можете сделать это в Аде? У Ады есть препроцессор?


person paxos1977    schedule 12.11.2008    source источник


Ответы (6)


Ответ на ваш вопрос — нет, в Аде нет встроенного в язык препроцессора. Это означает, что каждый компилятор может иметь или не иметь его, и не существует «унифицированного» синтаксиса для предварительной обработки и таких вещей, как условная компиляция. Это было сделано намеренно: это считалось «вредным» для духа Ады.

Почти всегда есть способы обойти отсутствие препроцессора, но часто решение может быть немного громоздким. Например, вы можете объявить функции, специфичные для платформы, как «отдельные», а затем использовать инструменты сборки для компиляции правильной (либо система проекта, используя замену тела прагмы, либо очень простая система каталогов... поместите все файлы Windows в /windows/ и все файлы linux в /linux/ и включите соответствующий каталог для платформы).

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

person Louis Brandy    schedule 20.11.2008

AdaCore предоставляет препроцессор gnatprep, специализированный для Ada. Они заявляют, что gnatprep «не зависит от каких-либо специальных функций GNAT», поэтому звучит так, как будто он должен работать с компиляторами Ada, отличными от GNAT. Их Руководство пользователя также содержит некоторые советы по условной компиляции.

Я работал над проектом, в котором также использовался формат m4, а файлы спецификации и тела Ada имели суффиксы «.m4s» и «.m4b» соответственно.

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

person Marc C    schedule 18.11.2008
comment
На самом деле мы используем два компилятора, по одному для каждой платформы (не вариант). GNAT — один из них, но я надеялся на что-то, что будет работать через компиляторы. - person paxos1977; 19.11.2008
comment
Совет отличный. Спасибо! Вы изменили мою точку зрения на мультиплатформенные программы ADA. - person Diego Fernández Durán; 16.01.2012

Нет, но препроцессор CPP или m4 можно вызвать для любого файла в командной строке или с помощью инструмента сборки, такого как make или ant. Я предлагаю назвать ваш файл .ada как-то иначе. Я сделал это в течение некоторого времени на java-файлах. Я вызываю java-файл .m4 и использую правило make для создания .java, а затем создаю его обычным способом.

Надеюсь, это поможет.

person David Allan Finch    schedule 12.11.2008
comment
Не вызывает ли это проблем с отладкой кода, так как исходный код будет отличаться от того, который обработал компилятор Ады. - person David Arno; 12.11.2008
comment
Разумно создавайте макросы m4, и условная компиляция сохранит невыбранные ветки и вызовы макросов в закомментированных блоках, в то время как выбранная ветка будет раскомментирована. Таким образом, исходный код и вывод компилятора будут совпадать для целей отладки. - person JUST MY correct OPINION; 10.04.2010

Да, это имеет.

Если вы используете компилятор 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 вручную.

Это очень полезно, например, когда вам нужно скомпилировать один и тот же код для нескольких разных ОС, используя даже разные кросс-компиляторы.

person Rego    schedule 25.11.2011

Некоторые старые компиляторы эпохи Ады 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

person Daniel Miller    schedule 10.04.2010

Нет.

Если вы действительно хотите его, есть способы его получить (используйте C, используйте автономный и т. д.). Однако я бы возражал против этого. Это было целенаправленное дизайнерское решение, чтобы не иметь его. Вся идея препроцессора очень неадекватна.

Большая часть того, для чего используется препроцессор C, может быть выполнена в Ada другими, более надежными способами. Единственным важным исключением является внесение незначительных изменений в исходный файл для кроссплатформенной поддержки. Учитывая, как часто этим злоупотребляют в типичной кросс-платформенной программе на языке C, я все же рад, что в Аде нет его поддержки. Очень немногие разработчики C/C++ могут достаточно контролировать себя, чтобы сохранить «незначительные» изменения. Результат может работать, но человеку часто почти невозможно прочитать его.

Типичный способ Ады для достижения этого — поместить разный код в разные файлы и использовать вашу систему сборки, чтобы каким-то образом выбирать между ними во время компиляции. Make достаточно мощный, чтобы помочь вам сделать это.

person T.E.D.    schedule 20.11.2008