У Ады есть препроцессор? - PullRequest
3 голосов
/ 12 ноября 2008

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

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

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

Ответы [ 6 ]

7 голосов
/ 20 ноября 2008

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

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

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

5 голосов
/ 19 ноября 2008

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

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

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

3 голосов
/ 12 ноября 2008

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

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

2 голосов
/ 25 ноября 2011

Да, это так.

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

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

2 голосов
/ 10 апреля 2010

Некоторые старые компиляторы эпохи Ada1983 имеют пакет, называемый a.app, который использует # -префиксированное подмножество Ada (интерпретируется во время сборки) в качестве языка предварительной обработки для генерации Ada (который затем переводится в машинный код при компиляции время). Rational Verdix Ada Development System (VADS) является прародителем a.app среди нескольких компиляторов Ada. Например, Sun Microsystems извлекла из VADS Adar SPARCompiler и, таким образом, также имела a.app. Это мало чем отличается от использования PL / I в качестве препроцессора PL / I, как это сделала IBM.

Глава 2 - это некоторая документация о том, как выглядит a.app: http://dlc.sun.com/pdf/802-3641/802-3641.pdf

1 голос
/ 20 ноября 2008

Нет, это не так.

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

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

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

...