Вопрос

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

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

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

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

Да, это так.

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top