Ада-95. Компилятор GNAT
66ac8edd

Условная компиляция с помощью препроцессора 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;

Препроцессор gnatprep может принимать следующие опции командной строки:

-Dsymbol=value Позволяет объявить значение value для символа symbol

в командной строке запуска препроцессора gnatprep, а не в файле (аналогично опции -D для препроцессора языка C).

Например, -DMacintosh=FALSE.
-b  -  Заменить в выходном файле с исходным текстом команды препроцессора gnatprep

пустыми строками (вместо -c).
-c  -  Закомментировать в выходном файле с исходным текстом команды препроцессора gnatprep

вместо -b).
-r  -  Сгенерировать в выходном файле с исходным текстом директиву компилятора Source_Reference.
-s  -  Распечатать отсортированный список символов и их значений.
-u  -  Трактовать необъявленные символы как символы имеющие значение FALSE.
Следует заметить, что препроцессор gnatprep не имеет конструкций, эквивалентных __FILE__ (name of current source file)

или __LINE__ (number of current line), которые поддерживаются препроцессором языка C.


Содержание раздела