Условная компиляция с помощью препроцессора gnatprep
Хотя разработчики Ады решили не включать в язык директивы поддержки препроцессора, подобные используемым в языке программирования C, GNAT предусматривает препроцессор gnatprep, который позволяет осуществлять условную компиляцию Ада-программ.
Препроцессор gnatprep (GNAT PREProcessor) принимает файл содержащий директивы условной компиляции и генерирует, в результате своей работы, файл с исходным текстом в котором удалены все инструкции, которые не соответствуют условиям указанным в директивах условной компиляции.
Следует обратить внимание на то, что директивы условной компиляции не допускают использования выражений (в отличие от препроцессора языка C).
Таким образом, в директивах условной компиляции могут использоваться только переменные, которые могут принимать значения "истина" (True) или "ложь" (False).
Предположим, что у нас есть файл prepvalues
со следующими определениями для препроцессора:
ALPHAVERSION := True BETAVERSION := False RELEASEVERSION := False TRANSLATION := English |
Предположим также, что у нас есть небольшая программа, текст которой содержит директивы препроцессора gnatprep:
with Text_IO; use Text_IO;
procedure Preptest is -- включить только ту часть кода, которая уместна для этой версии #if ALPHAVERSION S_Version : String := "Alpha"; #elsif BETAVERSION S_Version : String := "Beta"; #elsif RELEASEVERSION S_Version : String := "Release"; #else S_Version : String := "Unknown"; #end if; -- строковой переменной S_Translation будет присваиваться -- значение переменной препроцессора $TRANSLATION S_Translation : String := "$TRANSLATION"; begin Put_Line( "This is the " & S_Version & " edition" ); Put_Line( "This is the " & S_Translation & " translation" ); end Preptest; |
В результате обработки показанной выше программы препроцессором gnatprep, с учетом значений указанных в файле prepvalues, будет получен следующий исходный текст программы:
with Text_IO; use Text_IO; procedure Preptest is -- включить только ту часть кода, которая уместна для этой версии S_Version : String := "Beta"; -- строковой переменной S_Translation будет присваиваться -- значение переменной препроцессора $TRANSLATION S_Translation : String := "English"; begin Put_Line( "This is the " & S_Version & " edition" ); Put_Line( "This is the " & S_Translation & " translation" ); end Preptest; |
-Dsymbol=value | - |
Позволяет объявить значение value для символа symbol в командной строке запуска препроцессора gnatprep, а не в файле (аналогично опции -D для препроцессора языка C). Например, -DMacintosh=FALSE. |
-b | - |
Заменить в выходном файле с исходным текстом команды препроцессора gnatprep пустыми строками (вместо -c). |
-c | - |
Закомментировать в выходном файле с исходным текстом команды препроцессора gnatprep вместо -b). |
-r | - | Сгенерировать в выходном файле с исходным текстом директиву компилятора Source_Reference. |
-s | - | Распечатать отсортированный список символов и их значений. |
-u | - | Трактовать необъявленные символы как символы имеющие значение FALSE. |
или __LINE__ (number of current line), которые поддерживаются препроцессором языка C.